是否可以强制自动属性使用只读支持字段?我的项目包含大量具有属性的类,这些属性的支持字段被标记为只读,因为它们仅在构建时设置。就风格而言,我喜欢使用自动属性,因为它删除了大量样板代码并鼓励使用属性成员而不是支持字段。但是,在使用自动属性时,我失去了支持字段的“只读性”。我知道编译器/运行时在以这种方式标记字段时能够利用一些性能增强,所以我希望能够将我的自动属性标记为只读,如下所示:[ReadOnly]publicstringLastName{get;}while而不是privatereadonlystring_LastName;publicstringLastName{get{return_LastName;有没有某种机制可以做到这一点?如果不是,自定义支持字段的性能提升真的值得吗?在我看来,将字段公开是另一种选择,以这种方式公开字段似乎是错误的。即公共只读字符串姓氏;我不敢,但你可以这样做:publicstringLastName{get;私有集;不如readonly好,但也不错。不,不幸的是没有办法做到这一点。就我个人而言,我认为C#中的自动实现属性缺少两样东西-默认值(我相信将在VB10中)和只能在构造函数中设置的只读属性。换句话说,我希望能够做到:publicclassFoo{publicstringTag{get;内部设置;}="默认值";//“只读”意味着“私有”,因为它只能//从同一类中的构造函数中设置publicintValue{get;只读设置;}publicFoo(){//在此处设置属性有效,但在其他任何地方都无效Value=20;正如Jared提到的,这意味着编译器对属性设置器的调用更改为简单的字段分配,并确保它们只发生在构造函数中。这将使编写不可变类型更简单。不幸的是,C#4并没有改进。我们希望我们可以为C#5获得类似的东西……不,不是,如果不进行重大调整,该功能将毫无用处。仅验证构造函数中的只读字段。自动实现的属性只能从生成的设置器中设置。这些是不兼容的要求,会产生未经验证的代码。是的,您可以让编译器足够聪明以忽略setter并直接转到构造函数中的支持字段。但制定者本身仍然无法证实。编译器需要从生成的代码中省略它,因为它将生成一个真正的只读属性。这会造成另一个不一致,因为您仍然需要对该属性执行赋值语句。Foo(){SomeProperty="somevalue";在这种情况下,代码看起来像是在调用属性的设置器。但实际上并没有可调用的setter,因为它必须从最终代码中省略。编辑这并不是说它不能完成。它可以但需要在C#中进行一些工作。特别是,它们必须提供一种方法来设置没有setter的属性的支持字段。做这件事有很多种方法。我并不是说这些都是好的选择,只是让这种功能发挥作用的可能性。从C#6.0开始,答案是肯定的。你的例子可以这样写,编译器会自动在属性后面生成一个只读字段。这称为getter-only自动属性。公共字符串姓氏{得到;}来自https://msdn.microsoft.com/en-us/magazine/dn879355.aspx只有getter-only自动属性在结构和类声明中可用,但它们对于结构尤为重要,因为它是不变性的最佳实践指南.在C#6.0之前,声明只读属性并对其进行初始化所需的六行左右,现在只需要在构造函数中进行单行声明和赋值。因此,不可变结构的声明现在不仅是结构的正确编程模式,而且是更简单的模式——与以前的语法相比是一个非常容易理解的变化,在以前的语法中正确编码需要更多的努力。我更喜欢真正的只读支持字段,因为这保证我不会在构建后更改该支持字段。不,不。没有办法做到这一点,只读备份字段没有性能提升。以上是C#学习教程:Isitpossibleforceautomaticpropertiestouseread-onlybackingfields?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
