C#vnext中的主要构造函数

dav*_*v_i 18 c#

语言特性的实现情况经引起了我的注意C#聊天.关于这个现有问题中未涉及的一些功能,我有几个问题.

一些新功能很明显,例如仅限Getter的自动属性

public int Y { get; } = y;
Run Code Online (Sandbox Code Playgroud)

太棒了

但其他人我不清楚......


主要构造函数

class Point(int x, int y) { … }
Run Code Online (Sandbox Code Playgroud)

这可能是我所知的差距,但我之前没有遇到过"主要构造函数"这个术语,但是一些研究似乎表明,基本上这是定义以下内容的捷径

class Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 这是正确的解释吗?
  • 这是否意味着您仍然可以执行构造函数重载(术语"主要"意味着如此)?
  • 你能在其他构造函数/方法中引用这些隐式支持字段吗?

Tho*_*que 26

  • 这是正确的解释吗?

几乎,但不完全.默认情况下,主构造函数参数不会捕获到字段中; 但是,它们可以在实例成员初始值设定项中访问(并且只在那里),因此您可以使用它们显式初始化字段或属性:

class Point(int x, int y)
{
    public int X { get; } = x;
    public int Y { get; } = y;
}
Run Code Online (Sandbox Code Playgroud)

(请注意,在这种情况下,创建支持字段,但对于属性,而不是构造函数参数)

但是您也可以使用访问修饰符声明参数,在这种情况下,它们将被捕获为字段,并且可以从所有实例成员访问:

class Point(public readonly int x, public readonly int y)
{
}
Run Code Online (Sandbox Code Playgroud)

(如您所见,您还可以为字段指定其他修饰符,例如readonly)

  • 这是否意味着您仍然可以执行构造函数重载(术语"主要"意味着如此)?

是的,您可以拥有其他非主要构造函数.但是,它们都需要使用通常的: this(...)语法来调用主构造函数.

  • 你能在其他构造函数/方法中引用这些隐式支持字段吗?

如上所述,没有隐含的支持字段; 仅当您在主构造函数参数上显式指定访问修饰符时,才会创建支持字段.


编辑:此功能已被撤销,不会在C#6中(可能在C#7中,形式略有不同)

  • @dav_i,它不再出现在[本页](https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status)上,但有一段时间它出现了"Withdrawn".该决定在[此处](https://roslyn.codeplex.com/discussions/568820)进行了解释 (2认同)