REF和OUT关键字的介绍

声明:本文是本人最初写在51CTO上的一篇学习笔记,原文地址为:http://kestrelsaga.blog.51cto.com/3015222/717906

refout的比较:

ref与out关键字都是使参数通过引用来传递的,不同的是ref 要求变量必须在传递之前进行初始化,而out 的参数在传递之前不需要显式初始化。

在使用ref或out参数,方法定义和调用方法都必须显式使用ref或out关键字,如:

例1(out):

01.class OutExample
02.{
03.    static void Method(out int i)
04.    {
05.        i = 44;
06.    }
07.    static void Main()
08.    {
09.        int value;
10.        Method(out value);
11.        // value is now 44
12.    }
13.}  

例2(ref):

01.class RefExample
02. {
03.     static void Method(ref int i)
04.     {
05.         i = 44;
06.     }
07.
08.    static void Main()
09.     {
10.         int val = 0;
11.         Method(ref val);
12.         // val is now 44
13.     }
14. } 

尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:

01.class CS0663_Example
02.
03.{
04.
05.    // compiler error CS0663: "cannot define overloaded
06.
07.    // methods that differ only on ref and out"
08.
09.    public void SampleMethod(ref int i) {  }
10.
11.    public void SampleMethod(out int i) {  }
12.
13.} 

但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:

01.class RefOutOverloadExample
02.{
03.    public void SampleMethod(int i) {  }
04.    public void SampleMethod(ref int i) {  }
05.} 

示例:

1out

当希望方法返回多个值时,声明 out 方法很有用。使用 out 参数的方法仍然可以将变量用作返回类型,但它还可以将一个或多个对象作为 out 参数返回给调用方法。此示例使用 out 在一个方法调用中返回三个变量。请注意,第三个参数所赋的值为 Null。这样便允许方法有选择地返回值。

01.class OutReturnExample
02.{
03.    static void Method(out int i, out string s1, out string s2)
04.    {
05.        i = 44;
06.        s1 = "I‘ve been returned";
07.        s2 = null;
08.    }
09.    static void Main()
10.    {
11.        int value;
12.        string str1, str2;
13.        Method(out value, out str1, out str2);
14.        // value is now 44
15.        // str1 is now "I‘ve been returned"
16.        // str2 is (still) null;
17.    }
18.}  

2ref

按引用传递值类型是有用的,但是 ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。下面的示例显示出当引用类型作为 ref 参数传递时,可以更改对象本身。

01.class RefRefExample
02.{
03.    static void Method(ref string s)
04.    {
05.        s = "changed";
06.    }
07.
08.    static void Main()
09.    {
10.        string str = "original";
11.        Method(ref str);
12.        // str is now "changed"
13.    }
14.}  
时间: 2024-10-15 09:10:05

REF和OUT关键字的介绍的相关文章

关于c#中”ref”和”out”关键字的一些理解

一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正) 在c#中,方法的参数传递有四种类型: (1) 传值参数(by value) 传值参数无需额外的修饰符.传值参数在方法调用过程中,如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保持原来传入的值.实际 上,传值参数传递的是调用参数的一份拷贝,因此在调用方法的过程中,即使改变了参数的值,也不会影响到实际传入的参数值,详见例程: (2) 传址参数(by reference) 传址

C#方法参数传递-同时使用ref和out关键字

在方法参数传递中,可以同时使用ref和out关键字,但是要注意ref和out参数传递的不同. using System;class Program{static void Main(){    Program obj = new Program();    int score = 55; //声明原来分数    int refscore, outscore; //声明两个变量    obj.ChangeScore(score, ref refscore, out outscore);    Co

iOS开发——Swift篇&Swift关键字详细介绍

Swift关键字详细介绍 每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var.” 用于子句的: “ break, case, continue, default, do, else, fallthrough, if, i

LPTHW 笨办法学python 37章 python关键字/关键词介绍

本章简要的介绍了各种关键词: and:[布尔运算]且 del: 删除变量(函数,类) from: 从某一个库或者文件读取 not:[布尔运算]非 while: while-loop 关键字,后跟循环条件 as: 通常和import类叠加使用,代表以某个其他名称加载某个模块. elif: if分支控制的一部分. global: 声明一个变量为全局变量. or:[布尔运算]或 with:执行一个动作,通常和as一起使用,使用with后,完成动作后,必定关闭或者退出. assert: 声明一个错误.使

C# ref与out关键字解析

简介:ref和out是C#开发中经常使用的关键字,所以作为一个.NET开发,必须知道如何使用这两个关键字. 1.相同点 ref和out都是按地址传递,使用后都将改变原来参数的数值. 2.ref关键字 (1).使用ref关键字的注意点: i.方法定义和调用方法都必须显式使用 ref 关键字 ii.传递到 ref 参数的参数必须初始化,否则程序会报错 iii.通过ref的这个特性,一定程度上解决了C#中的函数只能有一个返回值的问题 (2).代码示例: using System; using Syst

ref、out 关键字

class ParameterTest { static void Main(string[] args) { int i = 0; int[] ints = { 0, 1, 2, 4, 8 }; Console.WriteLine("i = " + i); Console.WriteLine("ints[0] = " + ints[0]); SomeFunction(ints,i); Console.WriteLine("i = " + i);

C# 使用ref和out关键字

使用ref关键字,可以使参数按引用传递.当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中.若要使用ref关键字进行参数传递,则方法定义和调用方法都必须显示地使用ref关键字,而且使用ref关键字传递的参数必须最先进行初始化.使用out关键字的方法与使用ref关键字的方法类似,同样会导致参数通过引用来传递.不同之处在于,使用out关键字传递的参数并不需要最先进行初始化,但需要在方法返回之前进行赋值.若要使用out关键字传递参数,方法定义和调用方法都必须显示地使用out关键字.

5.C#知识点:ref和Out关键字浅谈

首先我们要知道ref和out在C#里面是什么? 答:它们俩是C#里面的关键字. 他们俩是干啥的呢? 答:他们俩是方法参数的修饰符号,一但使用,方法定义和方法都用都要使用这个关键字,这一点是死规定. 好了废话不多说,既然是修饰符,使用了他们一定是要有意义的对吧.我们先来看一手微软官方定义. 如果大家通过上面微软官方的定义明白了这个参数.那很好,下面的我写的就不需要看啦!还有疑惑就继续往下看.保证你能懂. 这里我先不直接讲解,我先掏出一手代码,然后通过代码讲解. using System; usin

Swift2.1关键字 @noescape介绍

@noescape优化编译器编译,swift 2.1引入. 函数如果有一个一个参数是closure的话,可以在前面加一个关键字@noescape表示在函数return前closure生命周期结束,可以优化编译.(closure 是引用类型, 可以引用到别的地方,如下:) class A{ var b: (Void -> Void)! func lalala(a: (Void->Void)){ self.b = a//引用到属性b了 } } 像上面的情况lalala的参数a是不能在前面标记@no