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

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

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

178 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 ... 106 107 108 109 110 111 112 113 114 ... 407
    Перейти на страницу:
    нереально. Предположим, что есть массив, содержащий 50 объектов совместимых с Shape типов, и только некоторые из них поддерживают интерфейс IPointy. Очевидно, что если вы попытаетесь обратиться к свойству Points для типа, который не реализует IPointy, то возникнет ошибка. Как же динамически определить, поддерживает ли класс или структура подходящий интерфейс?

    Один из способов выяснить во время выполнения, поддерживает ли тип конкретный интерфейс, предусматривает применение явного приведения. Если тип не поддерживает запрашиваемый интерфейс, то генерируется исключение InvalidCastException. В случае подобного рода необходимо использовать структурированную обработку исключений:

    ...

    // Перехватить возможное исключение InvalidCastException.

    Circle c = new Circle("Lisa");

    IPointy itfPt = null;

    try

    {

      itfPt = (IPointy)c;

      Console.WriteLine(itfPt.Points);

    }

    catch (InvalidCastException e)

    {

      Console.WriteLine(e.Message);

    }

    Console.ReadLine();

    Хотя можно было бы применить логику try/catch и надеяться на лучшее, в идеале хотелось бы определять, какие интерфейсы поддерживаются, до обращения к их членам. Давайте рассмотрим два способа, с помощью которых этого можно добиться.

    Получение ссылок на интерфейсы: ключевое слово as

    Для определения, поддерживает ли данный тип тот или иной интерфейс, можно использовать ключевое слово as, которое было представлено в главе 6. Если объект может трактоваться как указанный интерфейс, тогда возвращается ссылка на интересующий интерфейс, а если нет, то ссылка null. Таким образом, перед продолжением в коде необходимо реализовать проверку на предмет null:

    ...

    // Можно ли hex2 трактовать как IPointy?

    Hexagon hex2 = new Hexagon("Peter");

    IPointy itfPt2 = hex2 as IPointy;

    if(itfPt2 != null)

    {

      Console.WriteLine("Points: {0}", itfPt2.Points);

    }

    else

    {

       Console.WriteLine("OOPS! Not pointy...");  // He реализует IPointy

    }

    Console.ReadLine();

    Обратите внимание, что когда применяется ключевое слово as, отпадает необходимость в наличии логики try/catch, т.к. если ссылка не является null, то известно, что вызов происходит для действительной ссылки на интерфейс.

    Получение ссылок на интерфейсы: ключевое слово is (обновление в версии 7.0)

    Проверить, реализован ли нужный интерфейс, можно также с помощью ключевого слова is (о котором впервые упоминалось в главе 6). Если интересующий объект не совместим с указанным интерфейсом, тогда возвращается значение false. В случае предоставления в операторе имени переменной ей назначается надлежащий тип, что устраняет необходимость в проверке типа и выполнении приведения. Ниже показан обновленный предыдущий пример:

    Console.WriteLine("***** Fun with Interfaces *****n");

    ...

    if(hex2 is IPointy itfPt3)

    {

      Console.WriteLine("Points: {0}", itfPt3.Points);

    }

    else

    {

      Console.WriteLine("OOPS! Not pointy...");

    }

     Console.ReadLine();

    Стандартные реализации (нововведение в версии 8.0)

    Как упоминалось ранее, в версии C# 8.0 методы и свойства интерфейса могут иметь стандартные реализации. Добавьте к проекту новый интерфейс по имени IRegularPointy, предназначенный для представления многоугольника заданной формы. Вот код интерфейса:

    namespace CustomInterfaces

    {

      interface IRegularPointy : IPointy

      {

        int SideLength { get; set; }

        int NumberOfSides { get; set; }

        int Perimeter => SideLength * NumberOfSides;

      }

    }

    Добавьте к проекту новый файл класса по имени Square.cs, унаследуйте класс от базового класса Shape и реализуйте интерфейс IRegularPointy:

    namespace CustomInterfaces

    {

      class Square: Shape,IRegularPointy

      {

        public Square() { }

        public Square(string name) : base(name) { }

        // Метод Draw() поступает из базового класса Shape

        public override void Draw()

        {

          Console.WriteLine("Drawing a square");

        }

        // Это свойство поступает из интерфейса IPointy

        public byte Points => 4;

        // Это свойство поступает из интерфейса IRegularPointy.

        public int SideLength { get; set; }

        public int NumberOfSides { get; set; }

        // Обратите внимание, что свойство Perimeter не реализовано.

      }

    }

    Здесь мы невольно попали в первую "ловушку", связанную с использованием стандартных реализаций интерфейсов. Свойство Perimeter, определенное в интерфейсе IRegularPointy, в классе Square не определено, что делает его недоступным экземпляру класса Square. Чтобы удостовериться в этом, создайте новый экземпляр класса Square и выведите на консоль соответствующие значения:

    Console.WriteLine("n***** Fun with Interfaces *****n");

    ...

    var sq = new Square("Boxy")

      {NumberOfSides = 4, SideLength = 4};

    sq.Draw();

    // Следующий код не скомпилируется:

    // Console.WriteLine($"{sq.PetName} has {sq.NumberOfSides} of length

    {sq.SideLength} and a perimeter of {sq.Perimeter}");

    Взамен экземпляр Square потребуется явно привести к интерфейсу IRegularPointy (т.к. реализация находится именно там) и тогда можно будет получать доступ к свойству Perimeter. Модифицируйте код следующим образом:

    Console.WriteLine($"{sq.PetName} has {sq.NumberOfSides} of length {sq.SideLength} and a

    perimeter of {((IRegularPointy)sq).Perimeter}");

    Один из способов обхода этой проблемы — всегда указывать интерфейс типа. Измените определение экземпляра Square, указав вместо типа Square тип IRegularPointy:

    IRegularPointy sq = new Square("Boxy") {NumberOfSides = 4, SideLength = 4};

    Проблема с таким подходом (в данном случае) связана с тем, что метод Draw() и свойство PetName в интерфейсе не определены, а потому на этапе компиляции возникнут ошибки.

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

    Статические конструкторы и члены (нововведение в версии 8.0)

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

    interface IRegularPointy : IPointy

    {

      int SideLength { get; set; }

      int NumberOfSides { get; set; }

      int Perimeter => SideLength * NumberOfSides;

      // Статические члены также разрешены в версии C# 8

    1 ... 106 107 108 109 110 111 112 113 114 ... 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

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


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

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

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


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

    Новые отзывы

    1. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    2. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    3. Елена Елена08 июнь 11:13 Прочла несколько романов этого, без сомнения, талантливого автора. Впечатление прекрасное, но хотелось бы когда-нибудь прочесть... Предатель. Ты врал мне годами - Арина Арская
    Все комметарии
    Новинки бесплатной онлайн библиотеки