C#集合是值类型还是引用类型?

4

我正在忙着学习C#,C#的集合是值类型还是引用类型?因为数组是引用类型,我也知道字符串是引用类型。

谢谢。


2
值类型是结构体。您可以检查每个集合类型的定义(例如在文档中),但我不知道任何BCL集合类型实际上被定义为结构体。当然,您可以创建自己的结构体。 - Panagiotis Kanavos
1
你为什么要问这个问题?你为什么关心它们是否是值类型?你是想避免成员逐一复制的需要吗?还是你想模拟C++语义? - Panagiotis Kanavos
@PanagiotisKanavos 这是一个好问题,你所说的“care”是什么意思? - killer
1个回答

8
您可以创建一个值类型的集合(例如 struct MyCollection<T> : IEnumerable<T>),但几乎没有用处(因为您可以将其设置为只读,这样很简单,或者您可以尝试使其可变,但是要使其“值类型”可复制,以便集合的副本是与原始集合不同的实体,这将非常困难)(请注意,它仍然几乎没有用处,因为如果您通过其接口使用值类型,通常会对其进行装箱)。因此,最终不建议使用它。
我所记得的所有 .NET“基本”集合都是引用类型。因此,包括数组、List<>ArrayListDictionary<,>等。

1
自从.NET 4.5(Visual Studio 2012)以来,值类型(structSystem.ArraySegment<>是一种集合类型!例如,您可以通过new ArraySegment<string>(new[] { "a", "b", "c", "d", "e", }, 2, 3)进行foreach循环。这个结构体只是保存对数组的引用(数组是可变的引用类型)。由于它是浅复制,所以按值复制没有问题。仅复制引用是因为值语义。因此,在某些包装其他内容的情况下,拥有struct类型的集合类型是有意义的。 - Jeppe Stig Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接