繁体   English   中英

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

[英]Is a value-type with getters and setters still a value-type?

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

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

  2. 会发生装箱或拆箱吗?

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

是的,它仍然是值类型。

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

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

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

但是,编译器(至少是Microsoft编译器)将优化此代码,并内联调用getter和setter的方法,以使属性与使用公共字段之间的性能相同。

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

VarName仍然是值类型吗?

是。

还会进行装箱或拆箱吗?

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

存储与get / set有关的引用是否有开销?

否。C#编译器自动生成优化的get和set方法,这些方法除了分别检索和设置编译器生成的变量的值外,什么也不做。 通常最好将变量公开为属性而不是公共字段,以使诸如数据绑定之类的事情正常工作,并作为一般的最佳实践。

是的,它会,但是,如果它是一个类的属性,它将继续堆放,并且也不会发生装箱和拆箱,直到您在代码中显式地进行装箱为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM