表达体性与{get; 组;}

Max*_*Max 10 c# properties automatic-properties

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

private static string username;
internal static string Username { get => username; set => username = value; }
Run Code Online (Sandbox Code Playgroud)

使用这种风格是否有任何优势,或仅仅是偏好和可读性的问题?

internal static string Username { get; set; }
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 8

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

string Username { get => Username; set => Username = value; }
Run Code Online (Sandbox Code Playgroud)

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

string Username
{
    get
    {
        return Username;
    }
    set
    {
        Username = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以属性的 getter 和 setterUsername都引用了Username它本身的成员。所以当你访问该成员时,它会永远重复调用自己,永远不会返回结果。

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

string _username;
string Username { get => _username; set => _username = value; }
Run Code Online (Sandbox Code Playgroud)

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

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


Ser*_*gey 6

在以下情况下,表达式主体语法很方便使用:

仅获取或设置属性

public DateTime Date => DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

方法

public IEnumerable<string> GetData => SomeMethodThatReturnData.Select(x => x.Name);
Run Code Online (Sandbox Code Playgroud)

和带有1个输入参数的构造函数

public SomeClass(IRepository repository) => _repository = repository;
Run Code Online (Sandbox Code Playgroud)

  • 在您的三个示例中,只有一个是表达式主体*属性*。 (2认同)

dot*_*NET 5

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

  1. 你打字少。
  2. 可以快速阅读。
  3. 不会让读者认为 getter 或 setter 正在做一些特别的事情。
  4. Find All Reference返回的结果较少。

编辑

我错过了第一种风格的一个主要问题。请参阅下面的 poke 答案。