1

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

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

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

  3. 存储与获取/设置相关的引用是否有任何开销?

4

4 回答 4

3

是的,它仍然是一个值类型。

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

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

于 2010-12-08T15:14:26.473 回答
2

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

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

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

于 2010-12-08T15:13:57.613 回答
1

VarName 仍然是值类型吗?

是的。

还会发生任何装箱或拆箱吗?

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

存储与获取/设置相关的引用是否有任何开销?

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

于 2010-12-08T15:20:32.767 回答
0

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

于 2010-12-08T15:14:15.550 回答