.NET中ref和out参数的区别

在.NET中refout参数有什么区别? 有什么可以比另一个更有用的情况? 什么是一个代码片段,其中一个可以使用,另一个不能?

他们几乎是一样的 – 唯一的区别是,你作为一个outparameter passing的variables不需要被初始化,但将其作为parameter passing它必须被设置为某事。

 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参数的方法的调用者在调用之前不需要分配给作为outparameter passing的variables; 但是,被调用者在返回之前需要分配给out参数。

相反,ref参数被认为是由调用者初始分配的。 因此,被调用者在使用前不需要分配给ref参数。 参数参数传入和传出方法。

所以, out意味着,而ref是进出。

这些对应[in,out] COM接口的[out][in,out]参数[in,out]参数的优点是调用者在被调用的方法不需要的情况下不需要传递预先分配的对象 – 这可以避免分配的成本以及可能与编组相关的任何成本(更可能与COM相关,但在.NET中并不罕见)。

refout都允许被调用的方法修改一个参数。 他们之间的差异是你打电话之前发生的事情。

  • ref表示参数进入函数之前有一个值。 被调用的函数可以随时读取和更改值。 参数进入,然后出来

  • out表示参数在进入函数之前没有正式的值。 被调用函数必须初始化它。 该参数只会熄灭

这是我最喜欢看的方法: ref是通过引用传递variables。 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); 

下面是每个备选scheme效果的更详细清单:

在调用方法之前:

ref :调用者在传递给被调用方法之前必须设置参数的值。

out :在调用方法之前,调用者方法不需要设置参数的值。 最有可能的是,你不应该。 实际上,任何当前值都被丢弃。

在通话过程中:

ref :被调用的方法可以随时读取参数。

out :被调用的方法在读取之前必须初始化参数。

远程呼叫:

ref :将当前值编组为远程调用。 额外的性能成本。

out :没有任何东西被传递给远程调用。 更快。

从技术上讲,你可以使用总是代替out ,但是out可以让你对争论的含义更加精确,有时它可以更有效率。

OUT示例:在进入方法后,variables获取值初始化。 稍后将相同的值返回给主方法。

 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

===============================================

参考例子:variables应该在进入方法之前被初始化。 稍后相同的值或修改后的值将被返回给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 

=================================

希望现在清楚。

  • 一个refvariables在传入之前需要被初始化。
  • outvariables需要在你的函数实现中设置
  • out参数可以被认为是附加的返回variables(不是input)
  • ref参数可以被认为是input和输出variables。

参考和输出参数:

outref参数用于返回相同variables中的值,并将其作为方法的parameter passing。 当您的方法需要返回多个值时,这两个参数都非常有用。

您必须在Calee方法体中将值指定为out参数,否则该方法将不会被编译。


参数参数:必须在传递给方法之前进行初始化。 方法参数的ref关键字引起方法引用与作为inputparameter passing给同一方法的相同variables。 如果对variables做任何更改,它们都会反映在variables中。

 int sampleData = 0; sampleMethod(ref sampleData); 

参考参数Ex

 public static void Main() { int i = 3; // Variable need to be initialized sampleMethod(ref i ); } public static void sampleMethod(ref int sampleData) { sampleData++; } 

输出参数:传递给Method之前不需要初始化。 out参数可用于返回作为方法parameter passing的相同variables中的值。 对参数所做的任何更改都会反映在variables中。

  int sampleData; sampleMethod(out sampleData); 

Ex参数的Ex

 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#中,当你传递一个值types,如int,float,double等作为参数给方法参数时,它是通过值传递的。 因此,如果修改参数值,则不会影响方法调用中的参数。 但是如果用“ref”关键字标记参数,它将反映在实际variables中。

  • 在调用函数之前,您需要初始化variables。
  • 在方法中为ref参数赋值并不是强制的。 如果你不改变这个值,有什么需要把它标记为“ref”?

Ref参数不需要在函数中设置,而Out参数必须在退出函数之前绑定到一个值。 传出的variables也可以传递给函数,而不被初始化。

out指定该参数是一个输出参数,即在该方法明确设置之前它没有值。

ref指定该值是一个具有值的引用,其值可以在方法内更改。

out参数是通过调用方法初始化的,在调用方法之前初始化ref参数。 因此,当您只需要获取次要返回值时,会使用out参数, ref参数用于获取值可能返回该值的变化(其次是主返回值)。

ref关键字用于通过引用传递值。 (这并不排除传值是值types或引用types)。 使用out关键字指定的输出参数用于返回方法的值。

代码中的一个关键区别是您必须在方法内设置输出参数的值。 ref参数不是这种情况。

有关更多详细信息, 请参阅http://www.blackwasp.co.uk/CSharpMethodParameters.aspx

out参数是添加了特殊Out()属性的ref参数。 如果将一个C#方法的参数声明为out ,那么编译器将要求在读取该参数之前以及该方法返回前写入该参数。 如果C#调用其参数包含Out()属性的方法,则编译器将为了决定是否报告“未定义的variables”错误,假定在调用方法之前立即写入该variables。 请注意,由于其他.net语言不会将相同的含义附加到Out()属性,因此使用out参数调用例程可能会使该variables不受影响。 如果一个variables在被明确赋值之前被用作out参数,那么C#编译器将会生成代码以确保在它被使用之前的某个点被清除,但是如果这个variables离开并且重新进入了这个范围,那么就没有保证它会被再次清除。

ref可能会在null上窒息,因为它大概期望修改现有的对象。 out期望null,因为它返回一个新的对象。

out和ref是完全一样的,outvariables在发送到深渊之前不需要初始化。 我不是那么聪明,我从MSDN图书馆里掏钱:)。

然而,为了更明确地说明它们的用法,修饰符的含义是,如果在代码中更改该variables的引用,则out和ref将导致调用variables也更改引用。 在下面的代码中,一旦从调用返回到doStuff,ceovariables将成为newGuy的引用。 如果不是参考(或不参考),参考将不会改变。

 private void newEmployee() { Person ceo = Person.FindCEO(); doStuff(ref ceo); } private void doStuff(ref Person employee) { Person newGuy = new Person(); employee = newGuy; } 

这个在C#中的参数化参数有一些很好的例子。

概述的基本差异是out参数在传入时不需要被初始化,而ref参数可以。

在方法声明中声明out参数时 ,方法体应该在返回之前为outvariables赋值。 所以被调用方法的责任是在返回之前将值赋给out参数。

当在方法中声明ref参数时 ,在调用方法时传递的参数应该已经赋值。 所以在调用方法之前调用者有责任为ref参数赋值。

他们是微妙的不同。

在传递给方法之前, out参数不需要被调用者初始化。 因此,任何带out参数的方法

  • 在为其分配值之前,无法读取参数
  • 必须在返回之前为其分配一个值

这用于需要覆盖其参数的方法,而不pipe其先前的值如何。


在传递给方法之前,参数必须由被调用者初始化。 因此,任何具有ref参数的方法

  • 在分配之前可以检查该值
  • 可以返回原始值,不变

这是用于一个方法,必须(例如)检查它的价值和validation它或正常化它。