C# Доступный контекст как параметр метода - PullRequest
0 голосов
/ 06 апреля 2020

У меня вопрос о параметрах метода IDisposable.
Предположим, у меня есть класс, который реализует интерфейс IDisposable, например, "TestClass":

class TestClass : IDisposable
{
   public void TestMethod()
   {
     Console.WriteLine("I am a Test Method");
   }

   public void Dispose()
   {
     Console.WriteLine("Test Method was disposed!");
   }
}

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

static void Main(string[] args)
{
   using (var context = new TestClass())
   {
      X(context);
   }
}

public static void X(TestClass context)
{
  context.TestMethod();
}

В результате, как и ожидалось, вызывается метод Dispose (). (Отладчик подключен или отображает «Метод тестирования был удален!» На консоли)

Поэтому вопрос таков: если я напишу что-то вроде этого:

static void Main(string[] args)
{   
   X(new TestClass());
}

Я не вижу ни одного индикатора, который метод Dispose был вызван? Является ли контекст TestClass () автоматически удаляемым, если выполнение метода было успешным / законченным.

Вызывается ли метод dispose, когда сборщик мусора очищает это? Я обеспокоен тем, что ресурсоемкие контексты все еще будут открыты?

1 Ответ

1 голос
/ 06 апреля 2020

Сборщик мусора может очищать только управляемые ресурсы (вещи, созданные с помощью new). Классы, которые работают с неуправляемыми ресурсами , обычно реализуют финализатор / деструктор, который вызывает для вас Dispose(), когда вы этого еще не сделали. Сборщик мусора вызывает финализатор. См. здесь для примера и дополнительной информации.

Если вы явно не вызываете Dispose() и у вашего класса нет деструктора, Dispose() вообще не будет вызываться , Это не должно быть проблемой, потому что в этот момент сборщик мусора уже все равно очищается.

Так что для классов, которые не владеют неуправляемыми ресурсами, Dispose() просто дает контроль над , когда ресурсы должны быть освобождены.

...