getter和setter的值类型仍然是值类型吗?

时间:2010-12-08 15:10:52

标签: c# value-type setter getter

在C#中,如果我有以下代码:

public int VarName { get; set; }
  1. VarName仍然是值类型吗?

  2. 是否会发生装箱或拆箱?

  3. 是否存在存储与get / set相关的引用的开销?

4 个答案:

答案 0 :(得分:3)

是的,它仍然是值类型。

不,不会有任何装箱或拆箱(因为您不将其视为对象)。

不,没有开销,因为你没有存储与get / set相关的引用。它只是将int存储在编译器生成的支持字段中。

答案 1 :(得分:2)

getter和setter实际上是方法而不是字段。他们将设置int类型的支持字段(即值类型)并返回相同的支持字段。

然而编译器(至少是Microsoft的)会优化这段代码,并使方法调用getter和setter内联,这样属性和使用公共字段之间的性能是一样的。

总是首选在类中使用属​​性而不是公共变量。这样做的一个很好的理由是,如果你在设置变量时突然需要进行一些验证,你可以在不改变任何调用类的代码的情况下这样做,并且它也可以只让getter公开,这样任何订阅者都可以你的班级只能获得价值而不能设定它。

答案 2 :(得分:1)

  

VarName仍然是值类型吗?

  

也将任何装箱或拆箱   发生?

不,因为引用类型和值类型之间没有转换。

  

是否有任何存储开销   与get / set相关的参考文献?

没有。 C#编译器自动生成优化的get和set方法,它们分别检索和设置编译器生成的变量的值。将变量公开为属性而不是公共字段通常更好,这样数据绑定之类的东西就可以正常工作,而且只是作为一般的最佳实践。

答案 3 :(得分:0)

是的,它会,但如果它是一个类的属性,它将继续堆,并且在您在代码中明确地执行它之前,也不会发生装箱和拆箱。