Читать книги » Книги » Компьютеры и Интернет » Программирование » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 26 август 2023
Количество просмотров: 561
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

Язык программирования C#9 и платформа .NET5 - читать онлайн , автор Эндрю Троелсен

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

1 ... 82 83 84 85 86 ... 407 ВПЕРЕД
Перейти на страницу:
в версии 9.0)

В версии C# 9.0 появился особый вид классов — записи. Записи являются ссылочными типами, которые предоставляют синтезированные методы с целью обеспечения семантики значений для эквивалентности. По умолчанию типы записей неизменяемы. Хотя по существу дела вы могли бы создать неизменяемый класс, но с применением комбинации средств доступа только для инициализации и свойств, допускающих только чтение, типы записей позволяют избавиться от такой дополнительной работы.

Чтобы приступить к экспериментам с записями, создайте новый проект консольного приложения по имени FunWithRecords. Измените код класса Car из примеров, приведенных ранее в главе:

class Car

{

  public string Make { get; set; }

  public string Model { get; set; }

  public string Color { get; set; }

  public Car() {}

  public Car(string make, string model, string color)

    {

    Make = make;

    Model = model;

    Color = color;

  }

}

Как вы уже хорошо знаете, после создания экземпляра этого класса вы можете изменять любое свойство во время выполнения. Если каждый экземпляр должен быть неизменяемым, тогда можете модифицировать определения свойств следующим образом:

public string Make { get; init; }

public string Model { get; init; }

public string Color { get; init; }

Для использования нового класса Car в показанном ниже коде из файла Program.cs создаются два его экземпляра — один через инициализацию объекта, а другой посредством специального конструктора:

using System;

using FunWithRecords;

Console.WriteLine("Fun with Records!");

// Использовать инициализацию объекта

Car myCar = new Car

{

    Make = "Honda",

    Model = "Pilot",

    Color = "Blue"

};

Console.WriteLine("My car: ");

DisplayCarStats(myCar);

Console.WriteLine();

// Использовать специальный конструктор

Car anotherMyCar = new Car("Honda", "Pilot", "Blue");

Console.WriteLine("Another variable for my car: ");

DisplayCarStats(anotherMyCar);

Console.WriteLine();

// Попытка изменения свойства приводит к ошибке на этапе компиляции.

// myCar.Color = "Red";

Console.ReadLine();

static void DisplayCarStats(Car c)

{

  Console.WriteLine("Car Make: {0}", c.Make);

  Console.WriteLine("Car Model: {0}", c.Model);

  Console.WriteLine("Car Color: {0}", c.Color);

}

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

Чтобы создать тип записи CarRecord, добавьте к проекту новый файл по имени CarRecord.cs со следующим кодом:

record CarRecord

{

  public string Make { get; init; }

  public string Model { get; init; }

  public string Color { get; init; }

  public CarRecord () {}

  public CarRecord (string make, string model, string color)

  {

    Make = make;

    Model = model;

    Color = color;

  }

}

Запустив приведенный далее код из Program.cs, вы можете удостовериться в том, что поведение записи CarRecord будет таким же, как у класса Car со средствами доступа только для инициализации:

Console.WriteLine("/*************** RECORDS *********************/");

// Использовать инициализацию объекта

CarRecord myCarRecord = new CarRecord

{

    Make = "Honda",

    Model = "Pilot",

    Color = "Blue"

};

Console.WriteLine("My car: ");

DisplayCarRecordStats(myCarRecord);

Console.WriteLine();

// Использовать специальный конструктор

CarRecord anotherMyCarRecord = new CarRecord("Honda", "Pilot", "Blue");

Console.WriteLine("Another variable for my car: ");

Console.WriteLine(anotherMyCarRecord.ToString());

Console.WriteLine();

// Попытка изменения свойства приводит к ошибке на этапе компиляции.

// myCarRecord . Color = "Red";

Console.ReadLine();

Хотя мы пока еще не обсуждали эквивалентность (см. следующий раздел) или наследование (см. следующую главу) с типами записей, первое знакомство с записями не создает впечатления, что они обеспечивают большое преимущество. Текущий пример записи CarRecord включал весь ожидаемый связующий код. Заметное отличие присутствует в выводе: метод ToString() для типов записей более причудлив, как видно в показанном ниже фрагменте вывода:

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

My car:

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

Another variable for my car:

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

Но взгляните на следующее обновленное определение записи Car:

record CarRecord(string Make, string Model, string Color);

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

Эквивалентность с типами записей

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

Console.WriteLine($"Cars are the same? {myCar.Equals(anotherMyCar)}");

                 // Эквивалентны ли экземпляры Car?

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

Console.WriteLine($"Cars are the same reference?

  {ReferenceEquals(myCar, anotherMyCar)}");

                 // Указывают ли экземпляры Car на тот же самый объект?

Запуск программы дает приведенный ниже результат:

Cars are the same? False

CarRecords are the same? False

Типы записей ведут себя по-другому. Они неявно переопределяют Equals(), == и !=, чтобы производить результаты, как если бы экземпляры были типами значений. Взгляните на следующий код и показанные далее результаты:

Console.WriteLine($"CarRecords are the same?

  {myCarRecord.Equals(anotherMyCarRecord)}");

                 // Эквивалентны ли экземпляры CarRecord?

Console.WriteLine($"CarRecords are the same reference?

  {ReferenceEquals(myCarRecord,anotherMyCarRecord)}");

                 // Указывают ли экземпляры CarRecord на тот же

1 ... 82 83 84 85 86 ... 407 ВПЕРЕД
Перейти на страницу:
Комментарии (0)