Подтвердить что ты не робот

Первичные конструкторы в С# vnext

Состояние реализации функции языка было доведено до моего сведения через С# Chat, У меня есть пара вопросов о некоторых функциях, не описанных в этом существующем вопросе.

Некоторые из новых функций очевидны, такие как автоматические свойства Getter

public int Y { get; } = y;

... удивительный.

Но другие я не понимаю...


Первичные конструкторы

class Point(int x, int y) { … }

Это может быть пробел в моих знаниях, но я раньше не встречал термин "первичный конструктор", но некоторые исследования кажется, предполагает, что в основном это ярлык для определения следующих

class Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
  • Это правильная интерпретация?
  • Означает ли это, что вы все еще можете выполнять перегрузки конструктора (подразумевается так термин "первичный" )?
  • Вы можете ссылаться на эти неявные поля поддержки в других конструкторах/методах?
4b9b3361

Ответ 1

  • Это правильная интерпретация?

Почти, но не совсем. По умолчанию параметры первичного конструктора не записываются в поля; однако они доступны, например, в инициализаторах членов (и только там), поэтому вы можете явно инициализировать поля или свойства с ними:

class Point(int x, int y)
{
    public int X { get; } = x;
    public int Y { get; } = y;
}

(обратите внимание, что в этом случае создаются поля поддержки, но для свойств, а не для параметров конструктора)

Но вы также можете объявить параметры с помощью модификаторов доступа, и в этом случае они будут захвачены как поля и будут доступны из всех членов экземпляра:

class Point(public readonly int x, public readonly int y)
{
}

(как вы можете видеть, вы также можете указать другие модификаторы для полей, например readonly)

  • Означает ли это, что вы все еще можете выполнять перегрузки конструктора (подразумевается так термин "первичный" )?

Да, у вас могут быть другие, не первичные конструкторы. Тем не менее, все они должны вызывать первичный конструктор с помощью обычного синтаксиса : this(...).

  • Вы можете ссылаться на эти неявные поля поддержки в других конструкторах/методах?

Как упоминалось выше, нет никаких неявных полей поддержки; поле поддержки создается только в том случае, если вы явно указываете модификатор доступа в параметре основного конструктора.


EDIT: эта функция снята и не будет в С# 6 (возможно, в С# 7, в немного другой форме)