繁体   English   中英

C#直接传递引用类型vs out参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM