在C#中out保留字怎么使用

原创 2007年10月10日 21:55:00

表示这个变量要回传值,最简单的应用是除法,比如你需要一个除法方法,同时得到余数和商,但是普通的方法只能得到一个返回值,这个时候就可以使用Out参数,把另一个值返回。
比如,你定义了一个方法int a(int b,out int c),它除了能得到返回值外,还可以在方法里对C进行赋值,这样你就可以使用C的值了。

①ref要求参数必须被初始化,out没有这个要求。  
  ②ref参数可以被修改,也可以不被修改,但是out必须被赋值或者修改。  
  ③ref参数值可以在任何时候被调用参数使用,而out参数值只能在被赋值后才可以被使用。

1,明确语义:out在调用函数里必须赋值,语法检查里能确保这个变量确实被函数修改了。  
  2,相关性:out在调用函数前的赋值是被忽略的,也就是说与方法调用前的值无关,所以只要声明过就可以了。   

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。
当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。
使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。
当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。
ref 参数的值被传递到 ref 参数。 传递到 ref 参数的参数必须最先初始化。
将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。

两者都是按地址传递的,使用后都将改变原来的数值。
ref可以把参数的数值传递进函数,但是out是要把参数清空
就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
两个的区别:ref是有进有出,out是只出不进。

代码实例如下:

 1 namespace TestOutAndRef
 2 {
 3     class TestApp
 4     {
 5 
 6  static void outTest(out int x, out int y)
 7  {//离开这个函数前,必须对x和y赋值,否则会报错。
 8   //y = x;
 9   //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行
10   x = 1;
11   y = 2;
12  }
13  static void refTest(ref int x, ref int y)
14  {
15   x = 1;
16   y = x;
17  }
18 
19 
20  static public void OutArray(out int[] myArray)
21  {
22      // Initialize the array:
23      myArray = new int[5] { 12345 };
24  }
25  public static void FillArray(ref int[] arr)
26  {
27      // Create the array on demand:
28      if (arr == null)
29          arr = new int[10];
30      // Otherwise fill the array:
31      arr[0= 123;
32      arr[4= 1024;
33  }
34 
35 
36  public static void Main()
37  {
38   //out test
39   int a,b;
40   //out使用前,变量可以不赋值
41   outTest(out a, out b);
42   Console.WriteLine("a={0};b={1}",a,b);
43   int c=11,d=22;
44   outTest(out c, out d);
45   Console.WriteLine("c={0};d={1}",c,d);
46 
47   //ref test
48   int m,n;
49   //refTest(ref m, ref n);
50   //上面这行会出错,ref使用前,变量必须赋值
51 
52   int o=11,p=22;
53   refTest(ref o, ref p);
54   Console.WriteLine("o={0};p={1}",o,p);
55 
56 
57 
58   int[] myArray1; // Initialization is not required
59 
60   // Pass the array to the callee using out:
61   OutArray(out myArray1);
62 
63   // Display the array elements:
64   Console.WriteLine("Array1 elements are:");
65   for (int i = 0; i < myArray1.Length; i++)
66       Console.WriteLine(myArray1[i]);
67 
68   // Initialize the array:
69   int[] myArray = { 12345 };
70 
71   // Pass the array using ref:
72   FillArray(ref myArray);
73 
74   // Display the updated array:
75   Console.WriteLine("Array elements are:");
76   for (int i = 0; i < myArray.Length; i++)
77       Console.WriteLine(myArray[i]);
78  }
79     }
80 
81 }

运行结果 如下:
   


 

C# out的使用实例

//out的使用    class Program     {         static void ResoluteName(string fullname, out String first...
  • chaoa888
  • chaoa888
  • 2012年03月14日 10:44
  • 2326

JS关键字和保留字小结

1 关键字 break case catch continue default delete do else finally for function if in instanceof new ret...
  • liaozhongping
  • liaozhongping
  • 2015年08月09日 13:10
  • 1174

Java中被搁置的“goto”保留字

goto语句一直被人所诟病,说它使得代码结构复杂化,但是语言设计者们还是没有放弃goto这个功能强大的语句。Java以面向对象所著称也没能够放弃goto,而是把它当做保留字,但是并未在语言中得到正式使...
  • u014717036
  • u014717036
  • 2016年08月30日 19:57
  • 646

C#中in,out,ref的作用和区别

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键...
  • jadeflute
  • jadeflute
  • 2010年01月20日 22:13
  • 23283

C#中ref和out参数使用时需要注意的问题

C#方法中的ref和out      ref        通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响...
  • zzp_403184692
  • zzp_403184692
  • 2012年10月20日 10:10
  • 1584

C#保留字

定义C#保留字 是C#语言对于编译器有特殊意义的预定义标识,不允许用户将其作为自定义标识来使用。用户可在保留字前添加前缀符号@ 与保留字共同使用将其转变为自定义标识来使用。例如:@new数量截至201...
  • skyshu_2000
  • skyshu_2000
  • 2015年12月28日 18:54
  • 577

C# 关于out关键字的用法(一个方法返回多个值的问题)

通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回去。这个时候我们就要用到out关键字。 如果用ref也可以解决,但是用ref需...
  • shoneworn
  • shoneworn
  • 2015年12月26日 15:06
  • 1411

从Csharp走到VB.Net(一):MyClass保留字

2003年开始我接触的第一个B/S项目是DotNet,用的是Csharp.到现在2年过去了,也接触了VB.Net的项目,一步步走过来,看到同时CLR平台,2种语言在保留字上的特性还是很大的.以下我一一...
  • SlashOut
  • SlashOut
  • 2005年03月19日 13:51
  • 1003

【Lua】访问C#中的属性和方法-特殊情况-带有out和ref关键字

using System; using LuaInterface; namespace myLua { class MainClass { public string name = "Ocea...
  • sinat_20559947
  • sinat_20559947
  • 2015年08月28日 23:46
  • 3711

c语言保留字(关键字)汇总

由于是温习笔记,写的内容比较杂,比较基础。主要是写给自己看的,方便以后查阅。 今天来讲讲c中的保留字。 保留字(reserved word)   保留字又称关键字。   指在高级语言中已经定义...
  • hitwhylz
  • hitwhylz
  • 2013年07月20日 17:40
  • 16444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C#中out保留字怎么使用
举报原因:
原因补充:

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