Использование оператора против 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
Использование оператора против IDisposable.Dispose()
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.