C#6中(自动)属性初始化语法之间的差异

Ahm*_*gdy 9 c# properties c#-6.0

在C#6中初始化属性的以下表达式之间有什么区别:

1.从构造函数初始化的Auto-Property

public class Context1
{
    public Context1()
    {
        this.Items = new List<string>();
    }

    public List<string> Items { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

2:从支持字段初始化的属性

public class Context2
{
    private readonly List<string> items;

    public Context2()
    {
        this.items = new List<string>();
    }

    public List<string> Items
    {
        get
        {
            return this.items;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3:C#6中的Auto-Property新语法

public class Context3
{
    public List<string> Items { get; } = new List<string>();
}
Run Code Online (Sandbox Code Playgroud)

4:C#6中的自动属性新语法

public class Context4
{
    public List<string> Items => new List<string>();
}
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 14

清单3是C#6相当于清单2,其中支持字段在引擎盖下提供.

清单4:

public List<string> Items => new List<string>();
Run Code Online (Sandbox Code Playgroud)

相当于:

public List<string> Items { get { return new List<string>(); } }
Run Code Online (Sandbox Code Playgroud)

您可以想象每次访问该属性时都会返回一个新的空列表.

列表2/3和4之间的差异在本问答环节中进一步探讨了一个例子.

清单1只是一个带有getter和private setter的auto属性.它不是一个只读属性,因为您可以将它设置在任何类型的私有成员的任何位置.readonly属性(即getter-only属性)只能在构造函数或属性声明中初始化,就像readonly字段一样.

  • 如果通过"常数"表示"不断返回此值的新实例"(àlahttps://xkcd.com/221),那么......呃,我想是的.但那不是"常数"的意思.引用类型*不能*是常量是有原因的. (7认同)