[英]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
也不会添加它。
没有运行时或编译时错误,但我认为至少应该有一个警告。 我花了很长时间才弄清楚。
记录在案有点奇怪。
用{ 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.