繁体   English   中英

C# 是按引用还是按值返回?

[英]Does C# return by reference or value?

在以下场景中,“池”是按值返回还是按引用返回?

private static List<Item> Pool;

public static List<Item> GetPool()
{
    return Pool;
}

我想实现在请求时循环遍历列表的能力(以便另一个线程可以从列表中添加/删除项目,但调用线程的列表保持不变,以便 foreach 循环不会导致异常)。 如果它是按值返回的,那么它将是它自己的列表,而如果它是一个引用,我仍然有列表被修改的危险。 如果有什么不对的地方请指正,这只是我的理解

所有方法总是返回一个值。 他们永远不能返回引用。

如果它是按值返回的,那么它将是它自己的列表,而如果它是一个引用,我仍然有列表被修改的危险。

那是假的。 返回的值不是列表,而是对列表对象的引用,因为List是引用类型,所以任何使用从该方法返回的值的代码和任何直接访问该字段的代码都使用对同一对象的不同引用副本清单。

C# 总是按值返回*。 但是,在 C# 中,大多数类型都是引用类型,这意味着该类型的任何变量都是引用; 它是按值返回的引用。

(*) 也就是说,直到 ref 返回使它在 (C# 7?) 中。

Pool是一个List<Item>类型的变量。 因此它持有对List<Item>类型的对象的引用,或者它是null 话虽如此,当您读取此值时(实际上是GetPool ),您将获得对此对象的引用(或 null)。

让我们更清楚地说明值类型和引用类型之间的主要区别是什么。 int是一种值类型。 让我们考虑下面的一段代码。

int a = 4;
int b = a;
a = 5;

完成上述声明和赋值后, ab的值是多少?

a是5和值b是4,为什么? 第一个语句将 4 的文字值复制到a 第二条语句拷贝的价值ab 因此b的值为 4。请注意这里a的四个与b的四个不同。 (这就像你有两本同一本书。一份属于a ,另一份属于b )。 第三条语句后,值了a会是5。

另一方面,类是引用类型。 让我们声明以下类:

public Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

现在让我们考虑一下我们有以下一段代码。

var personA = new Person { FirstName = "Bob", LastName = "Barney" };
var personB = personA;
personA.FirstName = "Jack";

personA.FirstNamepersonB.FirstName的值是什么?

他们会完全一样, Jack 为什么?

因为在这一行

var personB = personA;

我们有一个引用副本(因为类是引用类型)。 就我们上面提到的这本书的范式而言,这意味着什么? 现在就好像我们扔了书的实体副本并且我们共享了一个 URL,我们可以在其中阅读这本书。 因为,我们都有相同的引用,所以当页面 30 中的某些内容发生变化时,我们都可以看到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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