表达式体成员不创建新实例?
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; }
标注的属性有一个存储值的内部字段。但是,第二个示例 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; }
}
我很好奇为什么 Expression-bodied 属性不创建持久对象。
public List<string> Pages { get; } = new List<string>();
像往常一样创建 List<string>
的持久性。
但是
public List<string> Pages => new List<string>();
这确实创建了一个新实例,但似乎不稳定。
即使将新字符串添加到 Pages
也不会添加它。
没有运行时错误和编译时错误,但我认为至少应该有一个警告。 我花了很长时间才弄明白。
记录有点奇怪。
用 { 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; }
}