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 ... 134 135 136 137 138 139 140 141 142 ... 407
    Перейти на страницу:
    специальных обобщенных типов. Давайте посмотрим, как включать обобщения в свои проекты. Первым делом будет построен обобщенный метод обмена. Начните с создания нового проекта консольного приложения по имени CustomGenericMethods.

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

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

    using System;

    namespace CustomGenericMethods

    {

      static class SwapFunctions

      {

        // Поменять местами два целочисленных значения.

        static void Swap(ref int a, ref int b)

        {

          int temp = a;

          a = b;

          b = temp;

        }

      }

    }

    Пока все идет хорошо. Но теперь предположим, что нужно менять местами также и два объекта Person; действие потребует написания новой версии метода Swap():

    // Поменять местами два объекта Person.

    static void Swap(ref Person a, ref Person b)

    {

      Person temp = a;

      a = b;

      b = temp;

    }

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

    Наличие группы перегруженных методов, отличающихся только входными аргументами — явный признак того, что обобщения могут облегчить ситуацию. Рассмотрим следующий обобщенный метод Swap<T>(), который способен менять местами два значения типа Т:

    // Этот метод будет менять местами два элемента

    // типа, указанного в параметре <Т>.

    static void Swap<T>(ref T a, ref T b)

    {

      Console.WriteLine("You sent the Swap() method a {0}", typeof(T));

      T temp = a;

      a = b;

      b = temp;

    }

    Обратите внимание, что обобщенный метод определен за счет указания параметра типа после имени метода, но перед списком параметров. Здесь заявлено, что метод Swap<T>() способен оперировать на любых двух параметрах типа <Т>. Для придания некоторой пикантности имя замещаемого типа выводится на консоль с использованием операции typeof() языка С#. Взгляните на показанный ниже вызывающий код, который меняет местами целочисленные и строковые значения:

    Console.WriteLine("***** Fun with Custom Generic Methods *****n");

    // Поменять местами два целочисленных значения.

    int a = 10, b = 90;

    Console.WriteLine("Before swap: {0}, {1}", a, b);

    SwapFunctions.Swap<int>(ref a, ref b);

    Console.WriteLine("After swap: {0}, {1}", a, b);

    Console.WriteLine();

    // Поменять местами два строковых значения.

    string s1 = "Hello", s2 = "There";

    Console.WriteLine("Before swap: {0} {1}!", s1, s2);

    SwapFunctions.Swap<string>(ref s1, ref s2);

    Console.WriteLine("After swap: {0} {1}!", s1, s2);

    Console.ReadLine();

    Вот вывод:

    ***** Fun with Custom Generic Methods *****

    Before swap: 10, 90

    You sent the Swap() method a System.Int32

    After swap: 90, 10

    Before swap: Hello There!

    You sent the Swap() method a System.String

    After swap: There Hello!

    Главное преимущество такого подхода в том, что придется сопровождать только одну версию Swap<T>(), однако она в состоянии работать с любыми двумя элементами заданного типа в безопасной в отношении типов манере. Еще лучше то, что находящиеся в стеке элементы остаются в стеке, а расположенные в куче — соответственно в куче.

    Выведение параметров типа

    При вызове обобщенных методов вроде Swap<T>() параметр типа можно опускать, если (и только если) обобщенный метод принимает аргументы, поскольку компилятор в состоянии вывести параметр типа на основе параметров членов. Например, добавив к операторам верхнего уровня следующий код, можно менять местами два значения System.Boolean:

    // Компилятор выведет тип System.Boolean.

    bool b1 = true, b2 = false;

    Console.WriteLine("Before swap: {0}, {1}", b1, b2);

    SwapFunctions.Swap(ref b1, ref b2);

    Console.WriteLine("After swap: {0}, {1}", b1, b2);

    Несмотря на то что компилятор может определить параметр типа на основе типа данных, который применялся в объявлениях b1 и b2, вы должны выработать привычку всегда указывать параметр типа явно:

    SwapFunctions.Swap<bool>(ref b1, ref b2);

    Такой подход позволяет другим программистам понять, что метод на самом деле является обобщенным. Кроме того, выведение типов параметров работает только в случае, если обобщенный метод принимает, по крайней мере, один параметр. Например, пусть в классе Program определен обобщенный метод DisplayBaseClass<T>():

    static void DisplayBaseClass<T>()

    {

      // BaseType - метод, используемый в рефлексии;

      // он будет описан в главе 17

      Console.WriteLine("Base class of {0} is: {1}.",

                         typeof(T), typeof(T).BaseType);

    }

    В таком случае при его вызове потребуется указать параметр типа:

    ...

    // Если метод не принимает параметров,

    // то должен быть указан параметр типа.

    DisplayBaseClass<int>();

    DisplayBaseClass<string>();

    // Ошибка на этапе компиляции! Нет параметров?

    // Должен быть предоставлен заполнитель!

    // DisplayBaseClass();

    Console.ReadLine();

    Разумеется, обобщенные методы не обязаны быть статическими, как в приведенных выше примерах. Кроме того, применимы все правила и варианты для необобщенных методов.

    Создание специальных обобщенных структур и классов

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

    1 ... 134 135 136 137 138 139 140 141 142 ... 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

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


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

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

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


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

    Новые отзывы

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