结构体可以包含引用类型的字段

Jam*_*Hay 53 c# struct reference-type

结构体是否包含引用类型的字段?如果可以,这是一个不好的做法?

Jon*_*eet 83

是的他们可以.这是个好主意吗?那么,这取决于具体情况.就个人而言,我很少首先创建自己的结构...我会对任何新的用户定义结构进行一定程度的怀疑.我并不是说它总是错误的选择,只是它需要更多明确的论证而不是一个阶级.

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

MyValueType foo = ...;
MyValueType bar = foo; // Value type, hence copy...

foo.List.Add("x");
// Eek, bar's list has now changed too!
Run Code Online (Sandbox Code Playgroud)

可变结构是邪恶的.引用可变类型的不可变结构以不同的方式悄悄地邪恶.

  • 搜索"可变结构是邪恶的",你会得到很多命中.它们确实是一个非常糟糕的想法,并且会让那些没有明确意识到这些想法的人感到惊讶.另请参阅类库设计指南. (8认同)
  • @Kayani:结构不是垃圾收集.结构将被存储(在堆栈或堆上,具体取决于情况和实现)正常...结构的字段值引用的对象在您无法访问时将有资格进行垃圾回收,就像平常...... (2认同)

Jar*_*Par 19

当然,这样做也不错.

struct Example {
  public readonly string Field1;
}
Run Code Online (Sandbox Code Playgroud)

readonly不是必需的,但优良的做法是使struct不可变.

  • “只读是不必要的” - 我认为对于任何“公共”字段来说它都是“必要的”,否则不知情的消费者可能会自己覆盖它。 (3认同)

Jud*_*ngo 5

是的,这是可能的,是的,这通常是一种不好的做法。

如果您看一下.NET框架本身,几乎会发现所有结构都只包含原始值类型。


小智 5

之所以不能具有可变结构,是因为引用类型的行为。阅读本文:http : //www.yoda.arachsys.com/csharp/parameters.html

当您有一个包含对象的结构(不是int或double之类的原语的任何结构)并复制该结构的实例时,内部的对象不会被“深层”复制,因为它只是引用(指针) )到包含实际类的内存位置。因此,如果复制包含类实例的可变结构,则该副本将引用与原始实例相同的实例(因此,上面的状态栏列表已更改)。

如果绝对必须使该结构可变,则将任何类实例设置为只读状态,或者-这是不好的做法-尝试确保您绝不复制该结构。