表达体性与{get;组;}

时间:2017-05-18 10:11:03

标签: 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; }

3 个答案:

答案 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)

我可以在第二种风格中快速看到的一些优点:

  1. 你少打字。
  2. 可以快速阅读。
  3. 没有让读者认为吸气剂或制定者正在做一些特别的事情。
  4. 查找所有参考返回的结果较少。
  5. 表达式evaulator不是由编译器触发的。
  6. 修改

    我错过了第一种风格的一个主要问题。请参阅下面的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