.NET中ref和out参数的区别是什么?在什么情况下,一个会比另一个更有用?一个可以使用而另一个不能使用的代码片段是什么?
当前回答
Out参数由调用的方法初始化,ref参数在调用方法之前初始化。因此,当您只需要获得第二个返回值时,使用out参数,ref参数用于获取一个值并可能返回对该值的更改(次于主返回值)。
其他回答
为什么c#中有“ref”和“out”?
带有out形参的方法的调用者不需要在调用之前赋值给作为out形参传递的变量;但是,被调用方需要在返回之前赋值给out形参。
相反,ref参数被认为是由调用者最初分配的。因此,被调用方在使用前不需要赋值给ref参数。Ref参数同时传入和传出方法。
out是out的意思,而ref是in和out的意思。
这些参数与COM接口的[out]和[in,out]参数密切对应,out参数的优点是,在被调用的方法不需要预分配对象的情况下,调用者不需要传递预分配对象——这避免了分配的成本,以及可能与封送相关的任何成本(更可能在COM中,但在. net中并不少见)。
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;
}
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形参在传递给方法之前不需要由被调用方初始化。因此,任何带有out参数的方法
在为参数赋值之前无法读取该参数 必须在返回之前给它赋值吗
这用于需要覆盖其参数的方法,而不管其先前的值如何。
ref形参在传递给方法之前必须由被调用方初始化。因此,任何带有ref参数的方法
在赋值之前可以检查值吗 可以返回原值,不受影响吗
这用于必须检查其值并对其进行验证或规范化的方法。
ref关键字用于通过引用传递值。(这并不排除传递的值是值类型或引用类型)。用out关键字指定的输出参数用于从方法返回值。
代码中的一个关键区别是必须在方法中设置输出参数的值。对于ref参数则不是这样。
欲了解更多细节,请访问http://www.blackwasp.co.uk/CSharpMethodParameters.aspx
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制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版本