当我让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;
}
}
因此,属性的 getter 和 setterUsername
都引用成员Username
即其本身。因此,当您访问该成员时,它将永远重复调用自己,并且永远不会返回结果。
您可能打算执行以下操作:
string _username;
string Username { get => _username; set => _username = value; }
现在,您有一个支持字段,您可以引用该字段来实际存储属性的值。这工作正常,与更详细的 getter 和 setter 语法没有区别。它编译为相同的东西;只是 C# 6 允许您在这里简化一点。
其余区别是显式支持字段与使用自动属性时自动创建的支持字段。是否要使用 auto 属性有点取决于您的风格,但一般来说,如果您要手动创建相同的支持字段,则没有真正的理由不使用它们。当然,如果您没有将值存储在普通支持字段中和/或需要其他逻辑,那么您当然不能在此处使用 auto 属性。但是,无论如何,您可能不会最终获得表情体属性。另请参阅有关自动属性的此问题。
表达式体语法在以下情况下使用起来很方便:
仅获取或设置属性
public DateTime Date => DateTime.Now;
方法
public IEnumerable<string> GetData => SomeMethodThatReturnData.Select(x => x.Name);
和具有 1 个输入参数的构造函数
public SomeClass(IRepository repository) => _repository = repository;
我可以在第二种风格中快速看到的一些优点:
- 你打字少。
- 可以快速阅读。
- 不会让读者认为getter或setter正在做一些特别的事情。
- 查找所有引用返回的结果较少。
编辑
我错过了第一种风格的一个主要问题。请参阅下面的戳的答案。