在C#6中初始化属性的以下表达式之间有什么区别:
1。从构造函数
初始化的Auto-Propertypublic class Context1
{
public Context1()
{
this.Items = new List<string>();
}
public List<string> Items { get; private set; }
}
2:从支持字段初始化的属性
public class Context2
{
private readonly List<string> items;
public Context2()
{
this.items = new List<string>();
}
public List<string> Items
{
get
{
return this.items;
}
}
}
3:C#6中的自动属性新语法
public class Context3
{
public List<string> Items { get; } = new List<string>();
}
4:C#6中的自动属性新语法
public class Context4
{
public List<string> Items => new List<string>();
}
答案 0 :(得分:14)
清单3是C#6相当于清单2,其中支持字段在引擎盖下提供。
清单4:
public List<string> Items => new List<string>();
相当于:
public List<string> Items { get { return new List<string>(); } }
您可以想象每次访问该属性时都会返回一个新的空列表。
在this Q&A中进一步探讨了清单2/3和清单4之间的差异。
清单1只是一个带有getter和私有setter的auto属性。它不是一个只读属性,因为您可以在任何可以访问任何类型的私有成员的地方设置它。 readonly属性(即getter-only属性)只能 在构造函数或属性声明中初始化,就像readonly字段一样。
答案 1 :(得分:4)
自动属性是自动实现的属性的简称,其中开发人员不需要显式声明支持字段,并且编译器设置了一个场景。
public class Context1
{
public Context1()
{
this.Items = new List<string>();
}
public List<string> Items { get; private set; }
}
通过为访问者指定更具限制性的可访问性,自动属性可以为setter和getter提供不同的可访问性,其可访问性与属性的可访问性不同。
其他例子是:
public string Prop1 { get; private set; }
public string Prop2 { get; protected set; }
public string Prop3 { get; internal set; }
public string Prop4 { protected internal get; set; }
可访问具有不同可访问性的访问者可以访问该可访问性所确定的任何位置,而不仅仅是来自构造函数。
公共类Context2 { private readonly List items;
public Context2()
{
this.items = new List<string>();
}
public List<string> Items
{
get { return this.items; }
}
} 在 C#6 之前,设置只读属性值的唯一方法是显式声明支持字段并直接设置它。
因为该字段具有readonly
访问者,所以只能在构造对象期间设置它。
public class Context3
{
public List<string> Items { get; } = new List<string>();
}
从 C#6 开始,编译器可以通过生成类似于读写自动属性的支持字段来处理§2,但在这种情况下,读取支持字段 - 只能且只能在构造对象时设置。
public class Context4
{
public List<string> Items => new List<string>();
}
当属性的值在每次获取时都会发生变化时, C#6 允许使用 lambda-like 语法声明getter的主体。
以上代码与此相同:
public class Context4
{
public List<string> Items
{
get { return new List<string>(); }
}
}