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

class Garage

{

    // Скрытое поддерживающее поле установлено в 1.

    public int NumberOfCars { get; set; } = 1;

    // Скрытое поддерживающее поле установлено в новый объект Car.

    public Car MyAuto { get; set; } = new Car();

    public Garage(){}

    public Garage(Car car, int number)

    {

        MyAuto = car;

        NumberOfCars = number;

    }

}

Наверняка вы согласитесь с тем, что автоматические свойства — очень полезное средство языка программирования С#, т.к. отдельные свойства в классе можно определять с применением модернизированного синтаксиса. Конечно, если вы создаете свойство, которое помимо получения и установки закрытого поддерживающего поля требует дополнительного кода (такого как логика проверки достоверности, регистрация в журнале событий, взаимодействие с базой данных и т.д.), то его придется определять как "нормальное" свойство .NET Core вручную. Автоматические свойства C# не делают ничего кроме обеспечения простой инкапсуляции для лежащей в основе порции (сгенерированных компилятором) закрытых данных.

<p id="AutBody_Root245">Понятие инициализации объектов</p>

На протяжении всей главы можно заметить, что при создании нового объекта конструктор позволяет указывать начальные значения. Вдобавок свойства позволяют безопасным образом получать и устанавливать лежащие в основе данные. При работе со сторонними классами, включая классы из библиотеки базовых классов .NET Core, нередко обнаруживается, что в них отсутствует конструктор, который позволял бы устанавливать абсолютно все порции данных состояния. В итоге программист обычно вынужден выбирать наилучший конструктор из числа возможных и затем присваивать остальные значения с использованием предоставляемого набора свойств.

<p id="AutBody_Root246">Обзор синтаксиса инициализации объектов</p>

Для упрощения процесса создания и подготовки объекта в C# предлагается синтаксис инициализации объектов. Такой прием делает возможным создание новой объектной переменной и присваивание значений многочисленным свойствам и/или открытым полям в нескольких строках кода. Синтаксически инициализатор объекта выглядит как список разделенных запятыми значений, помещенный в фигурные скобки ({}). Каждый элемент в списке инициализации отображается на имя открытого поля или открытого свойства инициализируемого объекта.

Чтобы увидеть данный синтаксис в действии, создайте новый проект консольного приложения по имени ObjectInitializers. Ниже показан класс Point, в котором присутствуют автоматические свойства (для синтаксиса инициализации объектов они не обязательны, но помогают получить более лаконичный код):

class Point

{

   public int X { get; set; }

   public int Y { get; set; }

   public Point(int xVal, int yVal)

   {

     X = xVal;

     Y = yVal;

   }

   public Point() { }

   public void DisplayStats()

   {

     Console.WriteLine("[{0}, {1}]", X, Y);

   }

}

А теперь посмотрим, как создавать объекты Point, с применением любого из следующих подходов:

Console.WriteLine("***** Fun with Object Init Syntax *****\n");

// Создать объект Point, устанавливая каждое свойство вручную.

Point firstPoint = new Point();

firstPoint.X = 10;

firstPoint.Y = 10;

firstPoint.DisplayStats();

// Или создать объект Point посредством специального конструктора.

Point anotherPoint = new Point(20, 20);

anotherPoint.DisplayStats();

// Или создать объект Point, используя синтаксис инициализации объектов.

Point finalPoint = new Point { X = 30, Y = 30 };

finalPoint.DisplayStats();

Console.ReadLine();

Перейти на страницу:

Похожие книги