这些参数与COM接口的 [out] 和 [in,out] 参数紧密对应, out 参数的优点是,在被调用方法不需要的情况下,调用者无需传递预先分配的对象 - 这可以避免分配成本,以及可能与编组相关的任何成本(更可能与COM相关,但在.NET中并不罕见) .
478
ref 和 out 都允许被调用的方法修改参数 . 它们之间的区别在于您拨打电话之前发生的事情 .
ref 表示该参数有一个值 before 进入该函数 . 被调用的函数可以随时读取和/或更改值 . 参数进入,然后出来
out 表示该参数在进入函数之前没有正式值 . 被调用的函数必须初始化它 . 该参数仅出现
这是我最喜欢看的方式: ref 是通过引用传递变量 . out 是为函数声明辅助 return value . 就像你可以这样写:
// 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 可以让您更准确地了解参数的含义,有时它可以更有效率 .
1
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;
}
}
}
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
=================================
希望现在清楚 .
0
参考和输出参数:
out 和 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之前无需初始化 . 出局参数可用于返回作为方法参数传递的同一变量中的值 . 对参数所做的任何更改都将反映在变量中 . int sampleData; sampleMethod(out sampleData);
Ex of Out Parameter
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;
}
18 回答
ref
变量需要在传入之前进行初始化 .需要在函数实现中设置
out
变量out
参数可以被认为是额外的返回变量(不是输入)ref
参数可以被认为是输入和输出变量 .他们是略有不同 .
在传递给方法之前,
out
参数不需要被调用者初始化 . 因此,任何带有out
参数的方法在为其赋值之前无法读取参数
必须在返回之前为其指定值
这用于需要覆盖其参数的方法,而不管其先前的值如何 .
在将被传递给方法之前,必须由被调用者初始化
ref
参数 . 因此,任何具有ref
参数的方法可以在分配之前检查该值
可以返回原始值,不受影响
这用于必须(例如)检查其值并对其进行验证或对其进行标准化的方法 .
它们几乎是一样的 - 唯一的区别是你作为
out
参数传递的变量不需要初始化,而是将它作为ref
参数传递,它必须设置为某种东西 .Ref
参数用于可能被修改的数据,out
参数用于作为函数的附加输出的数据(例如int.TryParse
),这些数据已经使用某些东西的返回值 .Why does C# have both 'ref' and 'out'?
取出参数的方法的调用者不需要分配给在调用之前作为out参数传递的变量;但是,被调用者需要在返回之前分配out参数 .
相比之下,ref参数被认为最初由呼叫者分配 . 因此,被调用者在使用之前不需要分配给ref参数 . Ref参数传入和传出方法 .
所以,
out
表示out,而ref
表示输入和输出 .这些参数与COM接口的
[out]
和[in,out]
参数紧密对应,out
参数的优点是,在被调用方法不需要的情况下,调用者无需传递预先分配的对象 - 这可以避免分配成本,以及可能与编组相关的任何成本(更可能与COM相关,但在.NET中并不罕见) .ref
和out
都允许被调用的方法修改参数 . 它们之间的区别在于您拨打电话之前发生的事情 .ref
表示该参数有一个值 before 进入该函数 . 被调用的函数可以随时读取和/或更改值 . 参数进入,然后出来out
表示该参数在进入函数之前没有正式值 . 被调用的函数必须初始化它 . 该参数仅出现这是我最喜欢看的方式:
ref
是通过引用传递变量 .out
是为函数声明辅助 return value . 就像你可以这样写:以下是每种备选方案效果的更详细列表:
在调用方法之前:
ref
:调用者必须在将参数传递给被调用方法之前设置该值 .out
:调用方法之前,不需要调用方法来设置参数的值 . 最有可能的,你不应该 . 实际上,任何当前值都被丢弃 .通话期间:
ref
:被调用的方法可以随时读取参数 .out
:被调用的方法必须在读取之前初始化参数 .远程电话:
ref
:当前值被编组到远程调用 . 额外的性能成本 .out
:没有任何内容传递给远程调用 . 快点 .从技术上讲,您可以使用
ref
代替out
,但out
可以让您更准确地了解参数的含义,有时它可以更有效率 .OUT的示例:变量在进入方法后初始化值 . 稍后,相同的值将返回到main方法 .
===============================================
Ref:Variable的示例应该在进入方法之前初始化 . 稍后相同的值或修改后的值将返回到main方法 .
=================================
希望现在清楚 .
参考和输出参数:
out
和ref
参数用于返回同一变量中的值,并将其作为方法的参数传递 . 当您的方法需要返回多个值时,这两个参数都非常有用 .您必须在calee方法体中为out参数赋值,否则该方法将不会被编译 .
Ex of Ref Parameter
Ex of Out Parameter
出:
在C#中,方法只能返回一个值 . 如果要返回多个值,可以使用out关键字 . out修饰符作为引用返回返回 . 最简单的答案是关键字“out”用于从方法中获取值 .
您无需初始化调用函数中的值 .
您必须在被调用函数中分配值,否则编译器将报告错误 .
ref:
在C#中,当您将一个值类型(如int,float,double等)作为参数传递给method参数时,它将按值传递 . 因此,如果修改参数值,则不会影响方法调用中的参数 . 但是如果用“ref”关键字标记参数,它将反映在实际变量中 .
您需要在调用函数之前初始化变量 .
不必为方法中的ref参数赋值 . 如果您不更改该值,需要将其标记为“ref”?
不需要在函数中设置Ref参数,而在退出函数之前必须将out参数绑定到一个值 . 作为输出传递的变量也可以在不初始化的情况下传递给函数 .
out
指定参数是输出参数,即在方法明确设置之前它没有值 .ref
指定该值是具有值的引用,并且可以在方法内更改其值 .out
参数由被调用的方法初始化,ref
参数在调用方法之前被初始化 . 因此,当您只需要获取辅助返回值时,将使用out
参数,ref
参数用于获取值并可能返回对该值的更改(其次返回主返回值) .ref关键字用于通过引用传递值 . (这并不排除传递的值是值类型或引用类型) . 使用out关键字指定的输出参数用于从方法返回值 .
代码中的一个关键区别是您必须在方法中设置输出参数的值 . 这不是ref参数的情况 .
有关详细信息,请查看http://www.blackwasp.co.uk/CSharpMethodParameters.aspx
out
参数是ref
参数,添加了特殊的Out()
属性 . 如果将C#方法的参数声明为out
,则编译器将要求在读取参数之前和方法返回之前写入参数 . 如果C#调用其参数包含Out()
属性的方法,则为了决定是否报告"undefined variable"错误,编译器将假定在调用方法之前立即写入变量 . 请注意,由于其他.net语言不会将相同的含义附加到Out()
属性,因此调用具有out
参数的例程可能会使有问题的变量不受影响 . 如果变量在明确赋值之前用作out
参数,则C#编译器将生成代码以确保它在使用之前的某个时刻被清除,但如果这样的变量离开并重新进入范围,则无法保证它将再次被清除 .ref可能会因为它可能会修改现有对象而阻塞null . out期望null,因为它返回一个新对象 .
out和ref完全相同,除了在将变量发送到深渊之前不必初始化out变量 . 我不那么聪明,我从MSDN库中删除了:) .
但是,为了更明确地使用它们,修饰符的含义是如果你在代码中更改了该变量的引用,out和ref将导致你的调用变量也改变引用 . 在下面的代码中,ceo变量将在从doStuff调用返回后引用newGuy . 如果不是ref(或out),则不会更改引用 .
这个The out and ref Paramerter in C#有一些很好的例子 .
概述的基本差异是
out
参数在传入时不需要初始化,而ref参数则不需要 .当在方法声明中声明out parameter时,方法体应在返回之前为out变量赋值 . 因此,被调用方法的责任是在返回之前将值分配给out参数 .
当在方法中声明ref parameter时,在调用方法时传递的参数应该已赋值 . 因此,在调用方法之前,调用者有责任为ref参数赋值 .
out已经在C#7 https://docs.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7#more-expression-bodied-members中获得了一个新的更多succint语法,更令人兴奋的是C#7元组增强功能比使用ref和out IMHO更优雅 .