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

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

Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

177 0 18:04, 26-08-2023
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
26 август 2023

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

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

    1 ... 80 81 82 83 84 85 86 87 88 ... 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 ... 80 81 82 83 84 85 86 87 88 ... 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Елена Елена07 июнь 20:15 Хорошо написанный,увлекательный роман, как, впрочем, и остальные произведения этого автора.... Развод. Ты меня предал - Арина Арская
    2. Лариса Лариса04 июнь 12:43 Да, просто до слез похоже на сериал ,,Даррел,,... Смерть в райском уголке - Эмили Салливан
    3. Stmara Stmara02 июнь 22:44 Приятная история, чтобы скоротать вечер. Любимая книга из последних "Любовь со смертью", также очень понравилась -"Суженная... Сердце космического дракона - Ольга Вадимовна Гусейнова
    Все комметарии
    Новинки бесплатной онлайн библиотеки