【问题标题】:C# reference types with reference type members具有引用类型成员的 C# 引用类型
【发布时间】:2017-03-20 16:50:16
【问题描述】:

所以我对 C# 还是很陌生,我知道引用类型是将对象的引用存储在内存中其他位置(通常在堆上)的类型。我的问题是,如果我有一个将其他类作为其成员变量的类,这些类成员变量是否也存储引用?我问是因为很多时候你只是希望你的类成员变量与它们拥有的对象的生命周期相关联,而让这些成员变量在内存中的其他地方存储对对象的引用是没有意义的。这只是在查找这些变量的值时增加了不必要的间接性。 现在我知道解决这个问题的一种方法是使这些成员变量成为结构,但是如果这些成员变量需要继承或其他仅类的特性怎么办?任何见解都值得赞赏。

【问题讨论】:

  • Now I know one way around this is to make those member variables structs stackoverflow.com/a/1932787/1260204 和blogs.msdn.microsoft.com/ericlippert/2009/04/27/…
  • @Igor 不,杰森是正确的。问题不在于内部对象是否存在于堆栈中,而是外部对象是否存储引用或内部对象本身。
  • @NicoSchertler - 啊,我看错了。

标签: c# composition reference-type


【解决方案1】:

很多时候你只想绑定你的类成员变量 到他们拥有的对象的生命周期

嗯,成员变量与拥有对象的生命周期相关联。只要您拥有的对象实例被垃圾回收——只要没有其他对其成员对象的引用——它们也将有资格进行垃圾回收。

随着您对语言和这些概念的熟悉程度越来越高,我想您会发现在几乎所有情况下使用引用类型都非常可取。在有限的情况下,您希望定义一个值类型,例如结构,而不是类,并且选择结构而不是类的决定与类实例的生命周期无关。见MSDN for guidance on choosing between a class and a struct

【讨论】:

    【解决方案2】:

    我的问题是,如果我有一个将其他类作为其成员变量的类,这些类成员变量是否也存储引用?

    是的

    ...您只想将您的类成员变量绑定到其拥有对象的生命周期...解决此问题的一种方法是使这些成员变量成为结构,但是如果这些成员变量需要继承或其他仅类功能怎么办?

    当没有更多对它们的引用时,所有对象都会被标记为垃圾回收,因此您只需使用类而不是结构。与类相比,结构是一种稀有品种。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2019-07-02
      相关资源
      最近更新 更多