.NET中的参数ref
和out
参数有什么区别?一个人比另一个人更有用的情况是什么?什么是一个可以使用而另一个不能使用的代码片段?
它们几乎是一样的 - 唯一的区别是你作为out
参数传递的变量不需要初始化,但是将它作为ref
参数传递它必须设置为某个东西.
int x; Foo(out x); // OK int y; Foo(ref y); // Error: y should be initialized before calling the method
Ref
参数用于可能被修改out
的数据,参数用于数据,该数据int.TryParse
是已经使用某些东西的返回值的函数(例如)的附加输出.
为什么C#同时具有'ref'和'out'?
取出参数的方法的调用者不需要分配给在调用之前作为out参数传递的变量; 但是,被调用者需要在返回之前分配out参数.
相比之下,ref参数被认为最初由呼叫者分配.因此,被调用者在使用之前不需要分配给ref参数.Ref参数传入和传出方法.
所以,out
意味着,而ref
不是进出.
这些与COM接口的参数[out]
和[in,out]
参数紧密对应,参数的优点out
是调用者在被调用的方法不需要的情况下不需要传递预分配的对象 - 这既避免了分配成本,又避免了任何成本可能与编组有关(更可能与COM有关,但在.NET中并不罕见).
ref
并且out
都允许被调用的方法修改参数.它们之间的区别在于您拨打电话之前发生的事情.
ref
表示参数在进入函数之前有一个值.被调用的函数可以随时读取和/或更改值.参数进入,然后出来
out
表示参数在进入函数之前没有正式值.被调用的函数必须初始化它.该参数仅出现
这是我最喜欢的方式:ref
通过引用传递变量.out
是声明函数的辅助返回值.这就像你可以这样写:
// This is not C# public (bool, string) GetWebThing(string name, ref Buffer paramBuffer); // This is C# public bool GetWebThing(string name, ref Buffer paramBuffer, out string actualUrl);
以下是每种备选方案效果的更详细列表:
ref
:调用者必须在将参数传递给被调用方法之前设置该值.
out
:调用方法之前,不需要调用方法来设置参数的值.最有可能的,你不应该.实际上,任何当前值都被丢弃.
ref
:被调用的方法可以随时读取参数.
out
:被调用的方法必须在读取之前初始化参数.
ref
:当前值被编组到远程调用.额外的性能成本.
out
:没有任何东西传递给远程调用.快点.
从技术上讲,你总是可以用来ref
代替out
,但是out
你可以更准确地说明论证的意义,有时它可以更有效率.
OUT的示例:变量在进入方法后初始化值.稍后,相同的值将返回到main方法.
namespace outreftry { class outref { static void Main(string[] args) { yyy a = new yyy(); ; // u can try giving int i=100 but is useless as that value is not passed into // the method. Only variable goes into the method and gets changed its // value and comes out. int i; a.abc(out i); System.Console.WriteLine(i); } } class yyy { public void abc(out int i) { i = 10; } } }
输出:
10
===============================================
参考示例:应该在进入方法之前初始化变量.稍后相同的值或修改后的值将返回到main方法.
namespace outreftry { class outref { static void Main(string[] args) { yyy a = new yyy(); ; int i = 0; a.abc(ref i); System.Console.WriteLine(i); } } class yyy { public void abc(ref int i) { System.Console.WriteLine(i); i = 10; } } }
输出:
0 10
=================================
希望现在清楚.
一个ref
变量需要通过它在之前被初始化.
一个out
变量需要在你的功能实现需要设置
out
参数可以被认为是额外的返回变量(不是输入)
ref
参数可以被认为是输入和输出变量.
的out
和ref
参数用于在相同的变量返回值,您传递作为方法的一个参数.当您的方法需要返回多个值时,这两个参数都非常有用.
您必须在calee方法体中为out参数赋值,否则该方法将不会被编译.
参数参数:必须在传递给Method之前进行初始化.
ref
方法参数上的关键字使方法引用作为同一方法的输入参数传递的同一变量.如果对变量进行任何更改,它们将反映在变量中.int sampleData = 0; sampleMethod(ref sampleData);
参考参数的例外
public static void Main() { int i = 3; // Variable need to be initialized sampleMethod(ref i ); } public static void sampleMethod(ref int sampleData) { sampleData++; }
Out参数:在传递给Method之前不需要初始化.该
out
参数可用于返回作为方法参数传递的同一变量中的值.对参数所做的任何更改都将反映在变量中.int sampleData; sampleMethod(out sampleData);
Out参数
public static void Main() { int i, j; // Variable need not be initialized sampleMethod(out i, out j); } public static int sampleMethod(out int sampleData1, out int sampleData2) { sampleData1 = 10; sampleData2 = 20; return 0; }
在C#中,方法只能返回一个值.如果要返回多个值,可以使用out关键字.out修饰符作为引用返回返回.最简单的答案是关键字"out"用于从方法中获取值.
您无需初始化调用函数中的值.
您必须在被调用函数中分配值,否则编译器将报告错误.
在C#中,当您传递一个值类型(如int,float,double等)作为方法参数的参数时,它将按值传递.因此,如果修改参数值,则不会影响方法调用中的参数.但是如果用"ref"关键字标记参数,它将反映在实际变量中.
在调用函数之前,需要初始化变量.
在方法中为ref参数赋值不是必须的.如果您不更改值,需要将其标记为"ref"?