繁体   English   中英

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

[英]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; }标记的属性 { get; }有一个存储值的内部字段。 但是,第二个表达式主体的示例将列表的创建声明为 getter,这意味着每次访问它时都会运行它,并且每次它创建一个新列表时都会运行它。

如评论中所述,它与get { return new List<string>(); }相同。 get { return new List<string>(); } ,以不同的方式解释它。

要更改此行为,您需要有一个内部字段来存储 List 实例和表达式主体成员以返回它。

按照您链接的文档中的链接,我们有只读属性

从 C# 6 开始,您可以使用表达式主体定义来实现只读属性。 为此,请使用以下语法:

 PropertyType PropertyName => expression;

以下示例定义了一个 Location 类,其只读 Name 属性实现为表达式主体定义,该定义返回私有 locationName 字段的值:

 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; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM