c# - 表达式主体属性与 {get;放;}

标签 c# properties automatic-properties

当我让 Visual Studio 2017 为我生成属性时,它将始终使用新的表达式主体属性,例如:

private static string username;
internal static string Username { get => username; set => username = value; }

与以下样式相比,使用这种样式有什么优势吗?或者这只是偏好和可读性的问题?

internal static string Username { get; set; }

最佳答案

是的,有区别;实际上是一个大的。您以前的解决方案将创建无限循环,因为属性 getter 和 setter 正在引用自身。

string Username { get => Username; set => Username = value; }

严格等同于以下内容(因为它只是语法糖):

string Username
{
    get
    {
        return Username;
    }
    set
    {
        Username = value;
    }
}

因此属性 Username 的 getter 和 setter 都引用了成员 Username 本身。因此,当您访问该成员时,它将永远重复调用自身并且永远不会返回结果。

您可能打算执行以下操作:

string _username;
string Username { get => _username; set => _username = value; }

现在您有了一个支持字段,您可以引用它来实际存储属性的值。这工作得很好,并且与更详细的 getter 和 setter 语法没有区别。它编译成同样的东西;只是 C# 6 允许您在这里变得更简单。

剩下的区别是显式支持字段与使用自动属性时自动创建的支持字段。是否要使用自动属性在一定程度上取决于您的风格,但一般来说,如果如果您要手动创建相同的支持字段,则没有真正的理由不使用它们。当然,如果您没有将值存储在普通的支持字段中和/或需要额外的逻辑,那么您当然不能在此处使用自动属性。但无论如何,你最终可能不会得到表达式主体的属性。另请参阅this question关于汽车属性。

关于c# - 表达式主体属性与 {get;放;},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44044891/

相关文章:

c# - 在 WPF 的 ComboBox 中选择一个项目来执行操作

c# - 如何使用 C# 打开 RTF 文件而不显示 Microsoft Word "Convert File"对话框?

c# - 将 JSON 数据保存到 C# 自定义对象中

java - 如何配置 Maven 项目以从 config.properties 文件中读取?

javascript - 克隆javascript对象属性?

c# - 从 json 序列化列表对象构建动态表

c# - 从 xml 文件生成 POCO 对象

python - 如何使用列名+文件名格式自动重命名 python Dataframe 的列

c# - Getter 无体,Setter 有

c# - 从具有另一种类型属性的抽象类继承(.NET 3.5,C#)