表达式体成员不创建新实例?

Expression-bodied members doesn't create new instances?

我很好奇为什么 Expression-bodied 属性不创建持久对象。

public List<string> Pages { get; } = new List<string>();

像往常一样创建 List<string> 的持久性。

但是

public List<string> Pages => new List<string>();

这确实创建了一个新实例,但似乎不稳定。

即使将新字符串添加到 Pages 也不会添加它。

没有运行时错误和编译时错误,但我认为至少应该有一个警告。 我花了很长时间才弄明白。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members

记录有点奇怪。

{ get; } 标注的属性有一个存储值的内部字段。但是,第二个示例 expression-bodied 将列表的创建声明为 getter,这意味着每次访问它时它都会是 运行,并且每次它创建一个新的列表。

注释中注明,与get { return new List<string>(); }相同,换个方式解释。

要更改此行为,您需要有一个内部字段,用于将 List 实例和 expression-bodied 成员存储到 return 它。

根据您 link 编辑的文档中的 link,我们有 read-only properties

Starting with C# 6, you can use expression body definition to implement a read-only property. To do that, use the following syntax:

PropertyType PropertyName => expression;  

The following example defines a Location class whose read-only Name property is implemented as an expression body definition that returns the value of the private locationName field:

public class Location
{
   private string locationName;

   public Location(string name)
   {
      locationName = name;
   }

   public string Name => locationName;
}

(强调我的)

换句话说:当您访问 Name 属性 时,返回 locationName 持有的值。如果 locationName 的值发生变化,并且您再次访问 Name,您将获得 locationName 的新值。

相当于:

public string Name
{
    get => locationName;
}

public string Name
{
    get { return locationName; }
}