在以下场景中," Pool"是按价值还是按参考价格退回?
private static List<Item> Pool;
public static List<Item> GetPool()
{
return Pool;
}
我希望能够在请求时循环遍历列表(这样另一个线程可以在列表中添加/删除项目,但调用线程的列表保持不变,以便foreach循环不会引起异常)。如果它是按值返回的,那么它将是它自己的列表,而如果它是一个引用,我仍然有被修改列表的危险。如果出现任何问题,请纠正我,这只是我的理解
答案 0 :(得分:6)
所有方法总是返回一个值。他们永远不会返回参考。
如果它是按值返回的话那么它就是它自己的列表,而如果它是一个引用,我仍然有被修改列表的危险。
这是错误的。返回的值不是列表,而是列表对象的引用,因为List
是引用类型,因此使用此方法返回的值的任何代码以及直接访问该字段的任何代码都使用不同的副本引用相同的列表。
答案 1 :(得分:3)
C#始终按值*返回。但是,在C#中,大多数类型都是引用类型,这意味着该类型的任何变量都是引用;它是由值返回的引用。
(*)也就是说,直到ref返回才能进入(C#7?)。
答案 2 :(得分:3)
Pool
是List<Item>
类型的变量。因此,它包含对List<Item>
类型的对象的引用,或者它是null
。话虽这么说,当你读到这个值(实际上是GetPool
)时,你会得到对这个对象的引用(或者为null)。
让我们更清楚一点,值类型和引用类型之间的主区别是什么。 int
是值类型。让我们考虑以下代码。
int a = 4;
int b = a;
int a = 5;
完成上述所有作业后,a
和b
的值是多少?
a
的值为5,b
的值为4.为什么?第一个语句将文字值4复制到a
。第二个语句将a
的值复制到b
。因此,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.FirstName
和personB.FirstName
的价值是什么?
它们将完全相同,Jack
。为什么呢?
因为在这一行
var personB = personA;
我们有引用副本(因为类是引用类型)。就我们上面提到的书籍范例而言,它意味着什么?现在,就好像我们已经抛出一本书的实体副本,我们共享了一个URL,我们可以在其中阅读该书。因为,我们都有相同的参考,当页面30中的某些内容发生变化时,我们都可以看到它。