Использование оператора против IDisposable.Dispose()

Как заявил Брайан Уоршоу в here, это просто dot-net реализация блока try и finally, чтобы c#-language убедиться, что объект удален. Добавляя c#-language к его ответу, блок using также .cs-file гарантирует, что объект будет c#.net удален, даже если вы вернетесь внутрь dotnet с использованием scope.

Когда-то dotnet мне самому это было любопытно, и c# я проверил это, используя vb.net следующий подход:

Пользовательский тестовый класс IDisposable и основной

private class DisposableTest : IDisposable
{
    public string Name { get; set; }

    public void Dispose() { Console.WriteLine("{0}.Dispose() is called !", Name); }
}

public static void Main(string[] args)
{
    try
    {
        UsingReturnTest();
        UsingExceptionTest();                
    }
    catch { }

    try
    {
        DisposeReturnTest();
        DisposeExceptionTest();                
    }
    catch { }

    DisposeExtraTest();

    Console.ReadLine();
}        

Реализация тестовых случаев

private static string UsingReturnTest()
{
    using (DisposableTest usingReturn = new DisposableTest() { Name = "UsingReturn" })
    {
        return usingReturn.Name;
    }
}

private static void UsingExceptionTest()
{
    using (DisposableTest usingException = new DisposableTest() { Name = "UsingException" })
    {
        int x = int.Parse("NaN");
    }
}

private static string DisposeReturnTest()
{        
    DisposableTest disposeReturn = new DisposableTest() { Name = "DisposeReturn" };
    return disposeReturn.Name;
    disposeReturn.Dispose(); // # IDE Warning; Unreachable code detected
}

private static void DisposeExceptionTest()
{
    DisposableTest disposeException = new DisposableTest() { Name = "DisposeException" };
    int x = int.Parse("NaN");
    disposeException.Dispose();
}

private static void DisposeExtraTest()
{
    DisposableTest disposeExtra = null;
    try
    {
        disposeExtra = new DisposableTest() { Name = "DisposeExtra" };
        return;
    }
    catch { }
    finally
    {
        if (disposeExtra != null) { disposeExtra.Dispose(); }
    }
}

И вывод:

  • Вызывается UsingReturn.Dispose()!
  • Вызывается UsingException.Dispose()!
  • Вызывается DisposeExtra.Dispose()!

c#

.net

vb.net

using

idisposable

2022-08-01T03:05:23+00:00