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

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

На нашем литературном портале можно бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю, Троелсен Эндрю . Жанр: Базы данных. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале litmir.org.
Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 22 август 2024
Количество просмотров: 226
Читать онлайн

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту readbookfedya@gmail.com для удаления материала

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

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

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

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

Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

Перейти на страницу:

    private Song[] _allSongs = new Song[10000];

    public AllTracks()

    {

      // Предположим, что здесь производится

      // заполнение массива объектов Song.

      Console.WriteLine("Filling up the songs!");

    }

  }

}

<b>// MediaPlayer.cs</b>

<b>using System;</b>

<b>namespace LazyObjectInstantiation</b>

<b>{</b>

<b>  // Объект MediaPlayer имеет объекты AllTracks.</b>

  class MediaPlayer

  {

    // Предположим, что эти методы делают что-то полезное.

    public void Play()  { /* Воспроизведение композиции */ }

    public void Pause() { /* Пауза в воспроизведении */ }

    public void Stop()  { /* Останов воспроизведения */ }

    private AllTracks _allSongs = new AllTracks();

    public AllTracks GetAllTracks()

    {

      // Возвратить все композиции.

      return _allSongs;

    }

  }

}

В текущей реализации MediaPlayer предполагается, что пользователь объекта пожелает получать список объектов с помощью метода GetAllTracks(). Хорошо, а что если пользователю объекта такой список не нужен? В этой реализации память под переменную-член AllTracks по-прежнему будет выделяться, приводя тем самым к созданию 10 000 объектов Song в памяти:

using System;

using LazyObjectInstantiation;

Console.WriteLine(&quot;***** Fun with Lazy Instantiation *****n&quot;);

// В этом вызывающем коде получение всех композиций не производится,

// но косвенно все равно создаются 10 000 объектов!

MediaPlayer myPlayer = new MediaPlayer();

myPlayer.Play();

Console.ReadLine();

Безусловно, лучше не создавать 10 000 объектов, с которыми никто не будет работать, потому что в результате нагрузка на сборщик мусора .NET Core намного увеличится. В то время как можно вручную добавить код, который обеспечит создание объекта _allSongs только в случае, если он применяется (скажем, используя шаблон фабричного метода), есть более простой путь.

Библиотеки базовых классов предоставляют удобный обобщенный класс по имени Lazy&lt;&gt;, который определен в пространстве имен System внутри сборки mscorlib.dll. Он позволяет определять данные, которые не будут создаваться до тех пор, пока действительно не начнут применяться в коде. Поскольку класс является обобщенным, при первом его использовании вы должны явно указать тип создаваемого элемента, которым может быть любой тип из библиотек базовых классов .NET Core или специальный тип, построенный вами самостоятельно. Чтобы включить отложенную инициализацию переменной-члена AllTracks, просто приведите код MediaPlayer к следующему виду:

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

// Объект MediaPlayer имеет объект Lazy&lt;AllTracks&gt;.

class MediaPlayer

{

  ...

  private Lazy&lt;AllTracks&gt; _allSongs = new Lazy&lt;AllTracks&gt;();

  public AllTracks GetAllTracks()

  {

    // Возвратить все композиции.

    return _allSongs.Value;

  }

}

Помимо того факта, что переменная-член AllTracks теперь имеет тип Lazy&lt;&gt;, важно обратить внимание на изменение также и реализации показанного выше метода GetAllTracks(). В частности, для получения актуальных сохраненных данных (в этом случае объекта AllTracks, поддерживающего 10 000 объектов Song) должно применяться доступное только для чтения свойство Value класса Lazy&lt;&gt;.

Взгляните, как благодаря такому простому изменению приведенный далее модифицированный код будет косвенно размещать объекты Song в памяти, только если метод GetAllTracks() действительно вызывается:

Console.WriteLine(&quot;***** Fun with Lazy Instantiation *****n&quot;);

//  Память под объект AllTracks здесь не выделяется!

MediaPlayer myPlayer = new MediaPlayer();

myPlayer.Play();

// Размещение объекта AllTracks происходит

// только в случае вызова метода GetAllTracks().

MediaPlayer yourPlayer = new MediaPlayer();

AllTracks yourMusic = yourPlayer.GetAllTracks();

Console.ReadLine();

На заметку! Ленивое создание объектов полезно не только для уменьшения количества выделений памяти под ненужные объекты. Этот прием можно также использовать в ситуации, когда для создания члена применяется затратный в плане ресурсов код, такой как вызов удаленного метода, взаимодействие с реляционной базой данных и т.п.

Настройка процесса создания данных Lazy<>

При объявлении переменной Lazy() действительный внутренний тип данных создается с использованием стандартного конструктора:

Перейти на страницу:
Комментариев (0)