当我让Visual Studio 2017为我生成属性时,它将始终使用新的表达式 - 身体属性,例如:
private static string username;
internal static string Username { get => username; set => username = value; }
使用这种风格是否有任何优势,或者仅仅是偏好和可读性?
internal static string Username { get; set; }
答案 0 :(得分:3)
在以下情况下,表达式语法很方便使用它:
获取或仅设置属性
public DateTime Date => DateTime.Now;
方法
public IEnumerable<string> GetData => SomeMethodThatReturnData.Select(x => x.Name);
带有1个输入参数的构造函数
public SomeClass(IRepository repository) => _repository = repository;
答案 1 :(得分:2)
我可以在第二种风格中快速看到的一些优点:
我错过了第一种风格的一个主要问题。请参阅下面的poke答案。
答案 2 :(得分:1)
是的,有区别;实际上是个大人物。您以前的解决方案将创建一个无限循环,因为属性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。