关于ref和out

原创 2007年10月10日 22:19:00

方法参数上的 ref 关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。

传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。

属性不是变量,不能作为 ref 参数传递。

如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 refout 方面不同的重载。例如,以下重载声明是有效的:

class MyClass {   public void MyMethod(int i) {i = 10;}   public void MyMethod(ref int i) {i = 10;}}

但以下重载声明是无效的:

class MyClass {   public void MyMethod(out int i) {i = 10;}   public void MyMethod(ref int i) {i = 10;}}
// cs_ref.cs
using System;
public class MyClass
{
   public static void TestRef(ref char i)
   {
      // The value of i will be changed in the calling method
      i = 'b';
   }

   public static void TestNoRef(char i)
   {
      // The value of i will be unchanged in the calling method
      i = 'c';
   }

   // This method passes a variable as a ref parameter; the value of the
   // variable is changed after control passes back to this method.
   // The same variable is passed as a value parameter; the value of the
   // variable is unchanged after control is passed back to this method.
   public static void Main()
   {
  
      char i = 'a';    // variable must be initialized
      TestRef(ref i);  // the arg must be passed as ref
      Console.WriteLine(i);
      TestNoRef(i);
      Console.WriteLine(i);
   }
}

输出

b
b

方法参数out 关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。

若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。属性不是变量,不能作为 out 参数传递。

如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 refout 方面不同的重载。例如,以下重载声明是有效的:

class MyClass {   public void MyMethod(int i) {i = 10;}   public void MyMethod(out int i) {i = 10;}}

而以下重载声明是无效的:

class MyClass {   public void MyMethod(out int i) {i = 10;}   public void MyMethod(ref int i) {i = 10;}}
// example:cs_out.cs using System;public class MyClass {   public static int TestOut(out char i)    {      i = 'b';      return -1;   }   public static void Main()    {      char i;   // variable need not be initialized      Console.WriteLine(TestOut(out i));      Console.WriteLine(i);   }}

输出

-1b
 

ref和out的作用和区别

相同点:方法的定义和调用都必须显示使用ref、out关键字。都会导致参数按引用传递。 不同点:传递给ref关键字的参数必须赋初始值,而out不用。out关键字会清空变量,即使变量已经赋值也不行,...
  • fox123871
  • fox123871
  • 2014年08月07日 23:51
  • 1207

在C#中 ref和out的区别

在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功...
  • unity_http
  • unity_http
  • 2016年07月15日 20:36
  • 1310

c# ref out 区别 比较 汇总

ref(C# 参考) Visual Studio 2015 其他版本   ref 关键字会导致参数通过引用传递,而不是通过值传递。 通过引用传递的效果...
  • hejisan
  • hejisan
  • 2016年07月06日 00:05
  • 636

C# out、ref关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。 out: class Program { /* * out、ref都是引用传递,传递后使用...
  • CommandBaby
  • CommandBaby
  • 2016年04月06日 14:53
  • 3663

C#中方法参数 ref 与 out 的区别

方法中参数的类型有三种 in型参数 in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法 ref型参数 该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。 ...
  • jl1134069094
  • jl1134069094
  • 2016年01月13日 17:25
  • 910

ref 和out以及params参数详解

简介:     ref和out 都是按地址传递的,使用后都将改变原来的数值。     1.ref方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的 任何更改都...
  • U3D_YSJ
  • U3D_YSJ
  • 2015年12月16日 18:10
  • 1317

c#中out、ref和params的用法与区别

ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为 ref/out形式。两者都可以使函数传回多个结果。 两者区别: 两...
  • u011555996
  • u011555996
  • 2016年10月20日 13:52
  • 641

C#的out参数和ref参数

刚学C#的时候看过out参数和ref参数的用法,但是一直没有根据实际项目做过
  • u010771437
  • u010771437
  • 2014年11月12日 19:22
  • 615

c#中的关键字out是什么意思?ref是什么意思?它们有什么区别?

不知大家有没有遇到过需要一个函数返回多个值的情况。 当写代码要返回多个值的时候,当然可以返回一个数组来实现,但如果遇到需要返回的多个值的类型不同呢?这个时候怎么办? c#中,out关键字和ref关...
  • sinat_23079759
  • sinat_23079759
  • 2016年10月22日 22:14
  • 2027

C# ref 和 out ,params关键字的用法

C# ref,out,params 的用法。
  • mydad353193052
  • mydad353193052
  • 2015年08月29日 22:25
  • 779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 关于ref和out
举报原因:
原因补充:

(最多只允许输入30个字)