结构可以包含引用types的字段

结构可以包含引用types的字段吗? 如果可以的话,这是一个不好的做法?

是的他们可以。 这是个好主意吗? 那么,这取决于情况。 就我个人而言,我很less创build自己的结构…我会对待任何新的用户定义的结构有一定程度的怀疑。 我并不是说这总是一个错误的select,只是需要一个比class级更清晰的论证。

如果一个结构体对一个可变对象有一个引用是一个坏主意,否则你可以有两个看起来独立但不是的值:

MyValueType foo = ...; MyValueType bar = foo; // Value type, hence copy... foo.List.Add("x"); // Eek, bar's list has now changed too! 

可变的结构是邪恶的。 不可变结构与可变types的引用是不同的方式偷偷摸摸的邪恶。

当然,这样做不是不好的做法。

 struct Example { public readonly string Field1; } 

readonly不是必须的,但是使struct不可变是一个很好的习惯。

是的,这是可能的,是的,这通常是一个坏习惯。

如果你看看.NET框架本身,你会发现几乎所有的结构都只包含原始值types。

是的他们可以。

这取决于。

许多人认为结构应该是不可变的,在这种情况下,持有对象的引用可能意味着它不是。

但这取决于情况。

你不能有可变结构的原因是因为参考types的行为。 阅读这篇文章: http : //www.yoda.arachsys.com/csharp/parameters.html

当你有一个包含一个对象的结构(任何不是像int或double这样的基本types的东西)并且你复制了一个结构的实例的时候,里面的Object就不会被深度复制,因为它只是一个引用(指针)到包含实际类的内存位置。 因此,如果复制包含类实例的可变结构,副本将引用与原始实例相同的实例(因此上面更改了条列表)。

如果你绝对必须使结构变为可变的,那么就只能在readonly里面创build任何类的实例,或者这是不好的做法 – 尽量保证你永远不要拷贝结构体。