[英]C# Passing reference type directly vs out parameter
我有两种方法:
public void A(List<int> nums)
{
nums.Add(10);
}
public void B(out List<int> nums)
{
nums.Add(10);
}
这两个电话有什么区别?
List<int> numsA = new List<int>();
A(numsA);
List<int> numsB = new List<int>();
B(out numsB);
一般来说,我试图理解传递引用类型as-is或out参数之间的区别。
在您的示例中,方法B
将无法编译,因为out
参数被认为是未初始化的,因此您必须先初始化它,然后才能使用它。 此外,在使用out
参数调用方法时,您需要在调用站点指定out
关键字:
B(out numsB);
并且您不需要在调用之前初始化numbsB
变量,因为它将被方法覆盖。
Jon Skeet有一篇很棒的文章解释了传递参数的各种方法: C#中的参数传递
非ref,非out参数(如局部变量)表示存储位置。 如果存储位置的类型是引用类型,则存储位置保存对该类型的实例的引用。
相反,参考和输出参数保持对存储位置的引用 。 该存储位置可以是局部变量,字段或数组元素。 换句话说,ref和out参数引入了另一层间接。 如果方法中有reference-type ref或out参数,则它表示对对象的引用的引用。
为什么要引用对象的引用? 如果您需要修改对象的引用(而不是修改对象本身)。
在某些狭窄的情况下,这是一种有用的技术。 例如,您可能希望编写一个命令两个队列的函数,具体取决于哪个队列的值较小:
void OrderQueues(ref Queue<int> a, ref Queue<int> b)
{
if (a.Peek <= b.Peek) return;
var temp = a;
a = b;
b = temp;
}
如果要从方法返回多个值,则Out参数很有用:
void OldestAndYoungest(IEnumerable<Person> people, out Person youngest, out Person oldest)
{
youngest = null;
oldest = null;
foreach (var person in people)
{
if (youngest == null || person.Age < youngest.Age)
youngest = person;
if (oldest == null || oldest.Age < person.Age)
oldest = person;
}
}
根据我的经验,ref和out参数相当罕见,参考类型甚至更少。
请注意,ref参数必须由调用者初始化,而out参数必须由被调用者初始化。 如果您从未为ref参数赋值,则它应该是“正常”参数。 如果您从未为out参数赋值,如示例所示,则代码将无法编译。
out关键字使参数通过引用传递。 这类似于ref关键字,除了ref要求在传递之前初始化变量。 要使用out参数,方法定义和调用方法都必须显式使用out关键字。 例如:
http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx
在版本B中,该函数可以直接访问变量。 它就像'ref'关键字,除了必须从参数中的函数内分配变量。 它允许您从函数返回多个值。 调用语法是'B(out numsB);'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.