.NET中ref和out参数的区别是什么?在什么情况下,一个会比另一个更有用?一个可以使用而另一个不能使用的代码片段是什么?
当前回答
Out和ref是完全相同的,除了Out变量在发送到深渊之前不需要初始化。我没有那么聪明,我从MSDN库抄袭了:)。
然而,更明确地说,修饰符的含义是,如果您在代码中更改了该变量的引用,out和ref将导致调用变量也更改引用。在下面的代码中,一旦newGuy从doStuff调用中返回,ceo变量将是它的引用。如果不是为了ref(或out),引用就不会被改变。
private void newEmployee()
{
Person ceo = Person.FindCEO();
doStuff(ref ceo);
}
private void doStuff(ref Person employee)
{
Person newGuy = new Person();
employee = newGuy;
}
其他回答
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:没有任何东西传递给远程调用。得更快。
从技术上讲,您可以使用always ref来代替out,但out允许您更精确地确定参数的含义,有时它可以更有效。
out:
在c#中,一个方法只能返回一个值。如果希望返回多个值,可以使用out关键字。out修饰符返回为引用返回。最简单的答案是使用关键字“out”从方法中获取值。
您不需要在调用函数中初始化该值。 必须在被调用的函数中赋值,否则编译器将报错。
ref:
在c#中,当你将一个值类型,如int, float, double等作为参数传递给方法参数时,它是按值传递的。因此,如果修改形参值,它不会影响方法调用中的实参。但是,如果您用“ref”关键字标记参数,它将反映在实际的变量中。
在调用函数之前,需要初始化变量。 为方法中的ref参数赋值不是强制的。如果不更改值,为什么需要将其标记为“ref”?
OUT的例子:变量在进入方法后得到初始化的值。稍后将相同的值返回给主方法。
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
===============================================
例如:变量应该在进入方法之前初始化。稍后相同的值或修改后的值将返回给主方法。
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
=================================
希望现在晴了。
Out和ref是完全相同的,除了Out变量在发送到深渊之前不需要初始化。我没有那么聪明,我从MSDN库抄袭了:)。
然而,更明确地说,修饰符的含义是,如果您在代码中更改了该变量的引用,out和ref将导致调用变量也更改引用。在下面的代码中,一旦newGuy从doStuff调用中返回,ceo变量将是它的引用。如果不是为了ref(或out),引用就不会被改变。
private void newEmployee()
{
Person ceo = Person.FindCEO();
doStuff(ref ceo);
}
private void doStuff(ref Person employee)
{
Person newGuy = new Person();
employee = newGuy;
}
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;
}
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 没有ListBox。SelectionMode="None",是否有其他方法禁用列表框中的选择?
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何在iis7应用程序池中设置。net Framework 4.5版本