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


当前回答

为什么c#中有“ref”和“out”?

带有out形参的方法的调用者不需要在调用之前赋值给作为out形参传递的变量;但是,被调用方需要在返回之前赋值给out形参。

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

out是out的意思,而ref是in和out的意思。

这些参数与COM接口的[out]和[in,out]参数密切对应,out参数的优点是,在被调用的方法不需要预分配对象的情况下,调用者不需要传递预分配对象——这避免了分配的成本,以及可能与封送相关的任何成本(更可能在COM中,但在. net中并不少见)。

其他回答

Ref和Out参数:

out和ref参数用于在同一个变量中返回值,您可以将其作为方法的参数传递。当您的方法需要返回多个值时,这两个参数非常有用。

必须在calee方法体中为out参数赋值,否则该方法将无法编译。


参考参数:它必须在传递给方法之前初始化。 方法参数上的ref关键字使方法引用作为同一方法输入参数传递的相同变量。如果您对变量做了任何更改,这些更改将反映在变量中。 int sampleData = 0; sampleMethod (ref sampleData);

Ex of Ref参数

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 (sampleData);

Out参数的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; 
} 

Ref可能会在null时阻塞,因为它可能期望修改一个现有对象。Out需要null,因为它返回一个新对象。

在函数中不需要设置Ref形参,而out形参必须在退出函数之前绑定到一个值。传递出去的变量也可以在没有初始化的情况下传递给函数。

Out参数由调用的方法初始化,ref参数在调用方法之前初始化。因此,当您只需要获得第二个返回值时,使用out参数,ref参数用于获取一个值并可能返回对该值的更改(次于主返回值)。

out在c# 7中获得了新的更简洁的语法 https://learn.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7#more-expression-bodied-members 更令人兴奋的是c# 7的元组增强,这是一个比使用ref和out更优雅的选择。