在只读字段和仅getter属性之间使用一种方式比另一种方式有什么好处



虽然已经有类似的问题,但我不知道其中的使用是否会带来更多的性能提升,所以我有一个问题。

我听说只读字段可以在其类的所有构造函数中被替换。但在包括VS 2019在内的实际编译环境中,无论它们是同时拥有方法还是只有getter,每个属性都可以完成。他们的setter对于成功编译来说并不重要。

下面是关于这个问题的代码:

public class MyClass {
public readonly int value_field;
public int value_property { get; }

public MyClass(int x) {
this.value_field = x; // It's understandable
this.value_property = x; // This doesn't cause any errors.
}
}

那么,在性能和生产力方面,什么是更好的选择呢?

首先,我认为它们的性能不会有任何差异,看看下面的代码,这就是编译器处理代码的方式,属性的BackingField声明似乎被标记为只读,就像你为字段声明的一样(因为你已经将属性声明为仅getter属性(:

public class MyClass
{
public readonly int value_field;
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly int <value_property>k__BackingField;
public int value_property
{
[CompilerGenerated]
get
{
return <value_property>k__BackingField;
}
}
public MyClass(int x)
{
value_field = x;
<value_property>k__BackingField = x;
}
} 

其次,如果您想声明一个不能从构造函数初始化的真正的仅getter属性,则需要执行以下操作:

public int value_property { get { return 1; } }

最后,您可以从构造函数初始化只读值的原因是,它是C#6中的一个新功能,允许您创建只读属性并从构造函数初始化它们的值。这是参考资料。