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 ... 165 166 167 168 169 170 171 172 173 ... 407
    Перейти на страницу:
    class="empty-line"/>

    ReflectOverQueryResults(subset);

    // Вывести результаты.

    foreach (string s in subset)

    {

      Console.WriteLine("Item: {0}", s);

    }

    Запустив приложение, легко заметить, что переменная subset в действительности представляет собой экземпляр обобщенного типа OrderedEnumerable<TElement, ТКеу> (представленного в коде CIL как OrderedEnumerable`2), который является внутренним абстрактным типом, находящимся в сборке System.Linq.dll:

    ***** Info about your query using Query Expressions*****

    resultSet is of type: OrderedEnumerable`2

    resultSet location: System.Linq

    Внесите такое же изменение в код метода QueryOverStringsWithExtensionMethods(), но передав во втором параметре строку "Extension Methods":

    // Построить выражение запроса для поиска

    // в массиве элементов, содержащих пробел.

    IEnumerable<string> subset = currentVideoGames

        .Where(g => g.Contains(" ")) .OrderBy(g => g).Select(g => g);

    ReflectOverQueryResults(subset,"Extension Methods");

    // Вывести результаты.

    foreach (string s in subset)

    {

      Console.WriteLine("Item: {0}", s);

    }

    После запуска приложения выяснится, что переменная subset является экземпляром типа SelectIPartitionIterator. Но если удалить из запроса конструкцию Select(g=>g), то subset снова станет экземпляром типа OrderedEnumerable<TElement, ТКеу>. Что все это значит? Для подавляющего большинства разработчиков немногое (если вообще что-либо). Оба типа являются производными от IEnumerable<T>, проход по ним осуществляется одинаковым образом и они оба способны создавать список или массив своих значений.

    ***** Info about your query using Extension Methods *****

    resultSet is of type: SelectIPartitionIterator`2

    resultSet location: System.Linq

    LINQ и неявно типизированные локальные переменные

    Хотя в приведенной программе относительно легко выяснить, что результирующий набор может быть интерпретирован как перечисление объектов string (например, IEnumerable<string>), тот факт, что подмножество на самом деле имеет тип OrderedEnumerable<TElement, ТКеу>, не настолько ясен.

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

    Чтобы еще больше подчеркнуть данное обстоятельство, ниже показан дополнительный вспомогательный метод, определенный внутри класса Program:

    static void QueryOverInts()

    {

      int[] numbers = {10, 20, 30, 40, 1, 2, 3, 8};

      // Вывести только элементы меньше 10.

      IEnumerable<int> subset = from i in numbers where i < 10 select i;

      foreach (int i in subset)

      {

        Console.WriteLine("Item: {0}", i);

      }

      ReflectOverQueryResults(subset);

    }

    В рассматриваемом случае переменная subset имеет совершенно другой внутренний тип. На этот раз тип, реализующий интерфейс IEnumerable<int>, представляет собой низкоуровневый класс по имени WhereArrayIterator<T>:

    Item: 1

    Item: 2

    Item: 3

    Item: 8

    ***** Info about your query *****

    resultSet is of type: WhereArrayIterator`1

    resultSet location: System.Linq

    Учитывая, что точный тип запроса LINQ не вполне очевиден, в первых примерах результаты запросов были представлены как переменная IEnumerable<T>, где Т — тип данных в возвращенной последовательности (string, int и т.д.). Тем не менее, ситуация по-прежнему довольно запутана. Чтобы еще больше все усложнить, стоит упомянуть, что поскольку интерфейс IEnumerable<T> расширяет необобщенный IEnumerable, получать результат запроса LINQ допускается и так:

    System.Collections.IEnumerable subset =

      from i in numbers

      where i < 10

      select i;

    К счастью, неявная типизация при работе с запросами LINQ значительно проясняет картину:

    static void QueryOverInts()

    {

      int[] numbers = {10, 20, 30, 40, 1, 2, 3, 8};

      // Здесь используется неявная типизация...

      var subset = from i in numbers where i < 10 select i;

      // ...и здесь тоже.

      foreach (var i in subset)

      {

        Console.WriteLine("Item: {0} ", i);

      }

      ReflectOverQueryResults(subset);

    }

    В качестве эмпирического правила: при захвате результатов запроса LINQ всегда необходимо использовать неявную типизацию. Однако помните, что (в большинстве случаев) действительное возвращаемое значение имеет тип, реализующий интерфейс IEnumerable<T>.

    Какой точно тип кроется за ним (OrderedEnumerable<TElement, ТКеу>, WhereArrayIterator<T> и т.п.), к делу не относится, и определять его вовсе не обязательно. Как было показано в предыдущем примере кода, для прохода по извлеченным данным можно просто применить ключевое слово var внутри конструкции foreach.

    LINQ и расширяющие методы

    Несмотря на то что в текущем примере совершенно не требуется напрямую писать какие-то расширяющие методы, на самом деле они благополучно используются на заднем плане. Выражения запросов LINQ могут применяться для прохода по содержимому контейнеров данных, которые реализуют обобщенный интерфейс IEnumerable<T>. Тем не менее, класс System.Array (используемый для представления массива строк и массива целых чисел) не реализует этот контракт:

    // Похоже, что тип System.Array не реализует

    // корректную инфраструктуру для выражений запросов!

    public abstract class Array : ICloneable, IList,

      IStructuralComparable, IStructuralEquatable

    {

      ...

    }

    Хотя класс System.Array не реализует напрямую интерфейс IEnumerable<T>, он косвенно получает необходимую функциональность данного типа (а также многие другие члены, связанные с LINQ) через статический тип класса System.Linq.Enumerable.

    В служебном классе System.Linq.Enumerable определено множество обобщенных расширяющих методов (таких как Aggregate<T>(), First<T>(), Мах<Т>() и т.д.), которые класс System.Array (и другие типы) получают в свое распоряжение на заднем плане. Таким образом, если вы примените операцию точки к локальной переменной currentVideoGames, то обнаружите большое количество членов, которые отсутствуют в формальном определении System.Array. 

    Роль отложенного выполнения

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

    1 ... 165 166 167 168 169 170 171 172 173 ... 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

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


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

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

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


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

    Новые отзывы

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