C# ref and out的使用小结

相同点:

  1. ref 和 out 都是按地址传递的,使用后都将改变原来参数的数值;

  2. 方法定义和调用方法都必须显式使用 ref 或者 out关键字;

  3. 通过ref 和 ref 特性,一定程度上解决了C#中的函数只能有一个返回值的问题。

不同点:

  传递到 ref 参数的参数必须初始化,否则程序会报错。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int a = 1;

int b = 2;

Fun(ref a,ref b);

Console.WriteLine("a:{0},b:{1}", a, b);//输出:3和4说明传入Fun方法是a和b的引用

}

static void Fun(ref int a, ref int b) {

a = 3;

b = 4;

}

}

}

  out关键字无法将参数值传递到out参数所在的方法中, out参数的参数值初始化必须在其方法内进行,否则程序会报错。

using System.Text;

namespace ConsoleApp1

{

class Program

{

static void Main(string[] args)

{

int a = 100;

int b;

Fun(out a, out b);

Console.WriteLine("a:{0},b:{1}", a, b);

}

static void Fun(out int a, out int b)

{

//a = 1+2;

if (a == 100)

a = 2;

b = 1;

}

}

}

代码里报错 “Use of unassigned out parameter 'a' ”  

下面的代码是正确的。

using System;

namespace ConsoleApp1

{

class Program

{

static void Main(string[] args)

{

int a = 100;

int b;

Fun(out a, out b);

Console.WriteLine("a:{0},b:{1}", a, b);

}

static void Fun(out int a, out int b)

{

a = 1+2;

b = 1;

}

}

}

输出结果为:

注意点:

using System;

namespace ConsoleApplication1

{

class Program

{

public void SampleMethod(ref int i) { }

public void SampleMethod(out int i) { }

}

}

上面代码会报错“ 'Program' cannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'  ”

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

using System;

namespace ConsoleApplication1

{

class Program

{

public void SampleMethod(int i) { }

public void SampleMethod(ref int i) { }

}

}

上面代码会报错“ 'Program' cannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'  ”

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

using System;

namespace ConsoleApplication1

{

class Program

{

public void SampleMethod(int i) { }

public void SampleMethod(ref int i) { }

}

}

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

以上是 C# ref and out的使用小结 的全部内容, 来源链接: utcz.com/z/358155.html

回到顶部