GameDev: разработка на Unity3D
445 subscribers
6 photos
2 videos
7 files
40 links
Все для успешного развития разработчика в геймдев: от junior до CTO. SOLID на практике, IOC, DI. Новые паттерны для gamedev. Личный опыт.

Заявка на разбор тестовых https://forms.gle/kqVPv1jWT97Bkps9A
Download Telegram
#idisposable #управление_ресурсами

Приветствую, друзья!

Подведем итоги опроса про интерфейс IDisposable 👇
На момент подведения итогов получены следующие результаты:
44% - разработчик решает, что произойдет
16% - освободится память
26% - освободятся неуправляемые ресурсы
14% - затрудняются ответить.

Как показал опрос использование интерфейса IDisposable в C# часто некорректно связывают только с освобождением памяти или освобождением неуправляемых ресурсов.
‼️ На самом деле сам разработчик может задать сценарий происходящего.

Понимание работы IDisposable понадобится нам для дальнейших публикаций и разбора кода, поэтому приступим.

Один из вариантов использования интерфейса IDisposable в C# - реализация паттерна "ресурсов", суть которого состоит в управлении использованием ресурсов, таких как: файлы, сетевые подключения, базы данных и других неуправляемых ресурсов.

Управляемые ресурсы - это ресурсы, которыми управляет сборщик мусора, такие как объекты ref типа, созданные с использованием оператора new.
Сборщик мусора автоматически освобождает память, выделенную под управляемые ресурсы, когда они больше не используются.

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

Таким образом использование интерфейса IDisposable для реализации паттерна "ресурсов" помогает управлять ресурсами и предотвращать утечки памяти.

Рассмотрим другие сценарии.

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

Рассмотрим пример реализации паттерна "заимствования", где использование интерфейса IDisposable позволит гарантировать правильную обработку ресурса и избежать ошибок при работе с потоками данных.

class StreamResource : IDisposable
{
private Stream _stream;

public StreamResource(Stream stream)
{
_stream = stream;
}

public Stream GetStream()
{
return _stream;
}

public void Dispose()
{
_stream = null;
}
}

// Использование ресурса в блоке using
using (var resource = new StreamResource(new FileStream("file.txt", FileMode.Open)))
{
var stream = resource.GetStream();
// обработка потока данных
}


В примере класс StreamResource представляет собой ресурс (поток данных), который может быть заимствован в блоке using, после чего происходит автоматическое освобождение ресурса.
Внутри блока using происходит обработка потока данных.

Таким образом, использование интерфейса IDisposable в рассмотренном примере позволяет гарантировать правильную обработку ресурса и избежать ошибок при работе с потоками данных.

Продолжение 👇
👍6🔥2😱1
#idisposable #управление_ресурсами

IDisposable продолжение 👇

Другим примером использования интерфейса IDisposable является реализация механизма отмены операции или транзакции.

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

Рассмотрим реализацию механизма отмены операции на примере:
class Operation : IDisposable
{
private bool _isCompleted = false;

public void Execute()
{
// выполнение операции
_isCompleted = true;
}

public void Cancel()
{
if (!_isCompleted)
{
// отмена операции
_isCompleted = true;
}
}

public void Dispose()
{
if (!_isCompleted)
{
Cancel();
}
}
}

// Использование операции с возможностью отмены
using (var operation = new Operation())
{
try
{
operation.Execute();
// выполнение операции
}
catch (Exception ex)
{
// обработка ошибки
operation.Cancel();
}
}


В примере класс Operation представляет собой операцию, которая может быть выполнена и отменена.
В блоке using используется операция с возможностью отмены.
Если операция завершается успешно, то она просто выполняется, и интерфейс IDisposable не используется.
Если же происходит ошибка, то операция отменяется с помощью метода Cancel, который также вызывается при автоматическом освобождении ресурса благодаря интерфейсу IDisposable.

Использование интерфейс IDisposable в рассмотренном выше примере позволяет реализовать механизм отмены и гарантировать, что операция будет правильно завершена или отменена в любом случае.

Итак, мы рассмотрели варианты использования интерфейса IDisposable для реализации:
- паттерна "ресурсы" для управления ресурсам и предотвращения утечек памяти
- паттерна "заимствования" (borrowing) для работы с потоками данных
- реализация механизма отмены операции или транзакции.

Всем хорошего дня 👋

Для тех, кто планирует более глубокое погружение, в следующем посте подборка тематической литературы 👇
👍8
#библиотека_программиста #геймдев #idisposable

Подборка литературы по использованию IDisposable.

📚
1. Де Смет, Барт. C# 5.0 Unleashed, глава 20, "Диспозиция и финализация".

2. Скит, Джон. C# in Depth, глава 6, "Размещение объектов и сборка мусора".

3. MSDN. "Использование using в C#", (https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/using-statement).

4. CodeProject. "Implementing IDisposable and the Dispose Pattern Properly", (https://www.codeproject.com/Articles/15360/Implementing-IDisposable-and-the-Dispose-Pattern-P).

5. Albahari, Joseph and Albahari, Ben. C# 9.0 in a Nutshell: The Definitive Reference, глава 9, "Memory Management, Pointers, and Unsafe Code".

6. Nagel, Christian. Professional C# 7 and .NET Core 2.0, глава 21, "Unsafe Code and Pointers".

7. Скит, Джон. C# in Depth, глава 15, "Unsafe code and pointers".

8.Agafonov, Eugene. Mastering C# Concurrency: Write Flawless C# Code for Concurrent and Parallel Programming, глава 7, "Low-level Threading in C#".

9. Miles, Rob. C# Programming Yellow Book, глава 25, "Unsafe Code".

10. Официальная документация Microsoft по C#, раздел "Unsafe Code and Pointers".

11. C# Language Specification, раздел "28.1 Pointer types".

Приятного прочтения 🙂
👍2