Выбрать главу

{

  // 'Состояние' объекта Car.

  public string petName;

  public int currSpeed;

  // Специальный стандартный конструктор.

  public Car()

  {

    petName = "Chuck";

    currSpeed = 10;

...

}

В данном случае мы заставляем объекты Car начинать свое существование под именем Chuck и со скоростью 10 миль в час. Создать объект Car со стандартными значениями можно так:

Console.WriteLine("***** Fun with Class Types *****\n");

// Вызов стандартного конструктора.

Car chuck = new Car();

// Выводит строку "Chuck is going 10 MPH."

chuck.PrintState();

...

Определение специальных конструкторов

Обычно помимо стандартного конструктора в классах определяются дополнительные конструкторы. Тем самым пользователю объекта предоставляется простой и согласованный способ инициализации состояния объекта прямо во время его создания. Взгляните на следующее изменение класса Car, который теперь поддерживает в совокупности три конструктора:

class Car

{

  // 'Состояние' объекта Car.

  public string petName;

  public int currSpeed;

  // Специальный стандартный конструктор.

  public Car()

  {

    petName = "Chuck";

    currSpeed = 10;

  }

  // Здесь currSpeed получает стандартное значение для типа int (0).

  public Car(string pn)

  {

    petName = pn;

  }

  // Позволяет вызывающему коду установить полное состояние объекта Car.

  public Car(string pn, int cs)

  {

    petName = pn;

    currSpeed = cs;

  }

...

}

Имейте в виду, что один конструктор отличается от другого (с точки зрения компилятора С#) числом и/или типами аргументов. Вспомните из главы 4, что определение метода с тем же самым именем, но разным количеством или типами аргументов, называется перегрузкой метода. Таким образом, конструктор класса Car перегружен, чтобы предложить несколько способов создания объекта во время объявления. В любом случае теперь есть возможность создавать объекты Car, используя любой из его открытых конструкторов. Вот пример:

Console.WriteLine("***** Fun with Class Types *****\n");

// Создать объект Car по имени Chuck со скоростью 10 миль в час.

Car chuck = new Car();

chuck.PrintState();

// Создать объект Car по имени Mary со скоростью 0 миль в час.

Car mary = new Car("Mary");

mary.PrintState();

// Создать объект Car по имени Daisy со скоростью 75 миль в час.

Car daisy = new Car("Daisy", 75);

daisy.PrintState();

...

Конструкторы в виде членов, сжатых до выражений (нововведение в версии 7.0)

В C# 7 появились дополнительные случаи употребления для стиля членов, сжатых до выражений. Теперь такой синтаксис применим к конструкторам, финализаторам, а также к средствам доступа get/set для свойств и индексаторов. С учетом сказанного предыдущий конструктор можно переписать следующим образом:

// Здесь currSpeed получит стандартное

// значение для типа int (0).

public Car(string pn) => petName = pn;

Второй специальный конструктор не может быть преобразован в выражение, т.к. члены, сжатые до выражений, должны быть однострочными методами.

Конструкторы с параметрами out (нововведение в версии 7.3)

 Начиная с версии C# 7.3, в конструкторах (а также в рассматриваемых позже инициализаторах полей и свойств) могут использоваться параметры out. В качестве простого примера добавьте в класс Car следующий конструктор:

public Car(string pn, int cs, out bool inDanger)

{

  petName = pn;

  currSpeed = cs;

  if (cs > 100)

  {

    inDanger = true;

  }

  else

  {

    inDanger = false;

  }

}

Как обычно, должны соблюдаться все правила, касающиеся параметров out. В приведенном примере параметру inDanger потребуется присвоить значение до завершения конструктора.

Еще раз о стандартном конструкторе