当struct实例具有属性为'Reference Type?'时会发生什么?

时间:2011-05-09 11:10:50

标签: .net struct memory-management reference

当struct data-type具有Reference Type?

属性时,它仍然可以是值类型

它是否真的是一个以某种方式使用值类型行为处理的引用类型?

1 个答案:

答案 0 :(得分:4)

这很简单,真的。结构中的字段只包含作为引用类型的对象的引用。如果您熟悉其他语言(如C或C ++),您可能会立即将其识别为类似于“指针”,它实际上是一个包含“指向”对象所在的内存地址的值。

它不消耗更多内存,因为struct只存储对象的引用,而不是对象的完整副本。当不再有对该对象的引用时,它将有资格进行垃圾收集。

您可能会认为这类似于“按值”传递引用对象的方式。在VB.NET中,使用ByVal关键字明确指出了这一点。在C#中,按值传递对象只是默认值,您必须明确指出要使用ref通过引用传递它们。无论哪种方式,关键是参考对象仍然可以“按值”传递,因为传递的所有内容都是引用的副本,而不是整个对象的副本。

当然,像.NET这样的托管环境的一个好处就是你不必担心任何这些实现​​细节。如果您的结构包含表示值类型和引用类型的字段,那么您的代码将正常工作。

另请参阅我对这个非常相似问题的回答:Does it make sense to define a struct with a reference type member?值得考虑的是,您是否真的需要首先定义结构。大多数时候,班级是更好的选择。但无论您选择哪一个,包含引用类型的字段的行为都是相同的。