Dispose
Dispose у
IDisposable
должен быть идемпотентным: повторный
вызов не бросает. После закрытия метод
может бросить ObjectDisposedException.
using вызывает Dispose
автоматически.
Синтаксис
resource.Dispose();
Пример
Давайте вызвать Dispose дважды:
using System;
class Gate : IDisposable
{
public bool Closed { get; private set; }
public void Dispose()
{
Closed = true;
}
}
class Program
{
static void Main()
{
Gate gate = new Gate();
gate.Dispose();
gate.Dispose();
Console.WriteLine("abcde");
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте поймаем ObjectDisposedException:
using System;
class Gate : IDisposable
{
public bool Closed { get; private set; }
public void Work()
{
if (Closed)
{
throw new ObjectDisposedException(nameof(Gate));
}
}
public void Dispose()
{
Closed = true;
}
}
class Program
{
static void Main()
{
Gate gate = new Gate();
gate.Dispose();
try
{
gate.Work();
}
catch (ObjectDisposedException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Пример
Давайте проверить флаг после Dispose:
using System;
class Gate : IDisposable
{
public bool Closed { get; private set; }
public void Dispose()
{
Closed = true;
}
}
class Program
{
static void Main()
{
Gate gate = new Gate();
gate.Dispose();
Console.WriteLine(gate.Closed);
}
}
Результат выполнения кода:
True
Смотрите также
-
IDisposable,
интерфейс закрытия -
IAsyncDisposable,
асинхронный аналог -
DisposeAsync,
асинхронный метод -
ref struct,
тип на стеке