CarRecords are the same? True

CarRecords are not the same? False

Обратите внимание, что записи считаются эквивалентными, невзирая на то, что переменные указывают на два разных объекта в памяти.

<p id="AutBody_Root257">Копирование типов записей с использованием выражений with</p>

Для типов записей присваивание экземпляра такого типа новой переменной создает указатель на ту же самую ссылку, что аналогично поведению классов. Это демонстрируется в приведенном ниже коде:

CarRecord carRecordCopy = anotherMyCarRecord;

Console.WriteLine("Car Record copy results");

Console.WriteLine($"CarRecords are the same?

  {carRecordCopy.Equals(anotherMyCarRecord)}");

Console.WriteLine($"CarRecords are the same?

  {ReferenceEquals(carRecordCopy,

anotherMyCarRecord)}");

В результате запуска кода обе проверки возвращают True, доказывая эквивалентность по значению и по ссылке.

Для создания подлинной копии записи с модифицированным одним или большим числом свойств в версии C# 9.0 были введены выражения with. В конструкции with указываются любые подлежащие обновлению свойства вместе с их новыми значениями, а значения свойств, которые не были перечислены, копируются без изменений. Вот пример:

CarRecord ourOtherCar = myCarRecord with {Model = "Odyssey"};

Console.WriteLine("My copied car:");

Console.WriteLine(ourOtherCar.ToString());

Console.WriteLine("Car Record copy using with expression results");

                // Результаты копирования CarRecord

                // с использованием выражения with

Console.WriteLine($"CarRecords are the same?

  {ourOtherCar.Equals(myCarRecord)}");

Console.WriteLine($"CarRecords are the same?

  {ReferenceEquals(ourOtherCar, myCarRecord)}");

В коде создается новый экземпляр типа CarRecord с копированием значений Make и Color экземпляра myCarRecord и установкой Model в строку "Odyssey". Ниже показаны результаты выполнения кода:

/*************** RECORDS *********************/

My copied car:

CarRecord { Make = Honda, Model = Odyssey, Color = Blue }

Car Record copy using with expression results

CarRecords are the same? False

CarRecords are the same? False

С применением выражений with вы можете компоновать экземпляры типов записей в новые экземпляры типов записей с модифицированными значениями свойств. На этом начальное знакомство с новыми типами записей C# 9.0 завершено. В следующей главе будут подробно исследоваться типы записей и наследование.

<p id="AutBody_Root258">Резюме</p>

Целью главы было ознакомление вас с ролью типа класса C# и нового типа записи C# 9.0. Вы видели, что классы могут иметь любое количество конструкторов, которые позволяют пользователю объекта устанавливать состояние объекта при его создании. В главе также было продемонстрировано несколько приемов проектирования классов (и связанных с ними ключевых слов). Ключевое слово this используется для получения доступа к текущему объекту. Ключевое слово static дает возможность определять поля и члены, привязанные к уровню класса (не объекта). Ключевое слово const, модификатор readonly и средства доступа только для инициализации позволяют определять элементы данных, которые никогда не изменяются после первоначальной установки или конструирования объекта. Типы записей являются особым видом класса, который неизменяем и при сравнении одного экземпляра типа записи с другим экземпляром того же самого типа записи ведет себя подобно типам значений.

Большая часть главы была посвящена деталям первого принципа ООП — инкапсуляции. Вы узнали о модификаторах доступа C# и роли свойств типа, о синтаксисе инициализации объектов и о частичных классах. Теперь вы готовы перейти к чтению следующей главы, в которой речь пойдет о построении семейства взаимосвязанных классов с применением наследования и полиморфизма.

<p id="AutBody_Root259">Глава 6</p><p>Наследование и полиморфизм</p>
Перейти на страницу:

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