Будет ли использование работать на нуле?

Будет ли работать следующий код, если ресурс не реализует IDisposable?

  T resource = new T();
  using (resource as IDisposable)
  {
     ...
  }

8 ответов

Решение

Да, это будет работать, проверьте этот текущий тест:

[TestMethod]
public void TestMethod8()
{
    using (new MyClass() as IDisposable)
    {
    }
}
public class MyClass { }

Это просто работает без каких-либо проблем. Если соответствующий класс реализует IDisposable, он будет вызывать его, если нет, он все равно будет работать / работать:).

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

Да. using оператор проверяет, дается ли он null и избегает попытки позвонить Dispose если так.

Из раздела 8.13 спецификации C# 3:

Заявление об использовании переводится на три части: приобретение, использование и утилизация. Использование ресурса неявно заключено в оператор try, который включает в себя предложение finally. Это, наконец, пункт распоряжается ресурсом. Если нулевой ресурс получен, то вызов Dispose не выполняется и исключение не выдается.

Это должно работать нормально, даже если это не "правильный" подход к утилизации ресурсов. using Статуя просто синтаксический сахар для

IDisposable o = ...;

try
{
  // ...
}
finally
{
  if (o != null)
    o.Dispose(true);
}

Так что, если о никогда не реализуется IDisposable это будет нулевым в using заявление и попытался бы позвонить Dispose в теме.

При тестировании кода он не приводит к ошибкам во время компиляции или выполнения.

Из определения языка (см. Раздел 8.13):-

Если нулевой ресурс получен, то вызов Dispose не выполняется и исключение не выдается.

Если тип не может быть преобразован в IDisposible, оператор as преобразует ресурс в null, а код, инкапсулированный в блоке using, будет работать идеально, ведя себя точно так же, как если бы вы не заключили его в блок using.

Короче говоря, ответ на ваш вопрос - да.

Какая польза от этого? В чем преимущество? В чем выгода?

Оператор using гарантирует, что метод Dispose вызывается, но если ваш объект не реализует IDisposable, я не вижу смысла в этом? Он будет работать (как, он не будет генерировать исключения во время выполнения и будет компилироваться), я только что протестировал его здесь, но...

С записанным вами кодом вы даже не сможете использовать ресурс как IDisposable ...

Если под "сработает" вы имеете в виду, получите ли вы ошибку во время выполнения? Нет, не будешь.

Это может быть полезно, когда тип явно реализует IDisposable, и в этом случае метод Dispose не доступен напрямую для типа, если тип не приведен к типу IDisposable. Использование "as" делает безопасное приведение и гарантирует, что вызов Dispose. В большинстве случаев, когда тип явно реализует IDisposable, он предоставляет такие методы, как "Close", который, в свою очередь, вызывает Dispose

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

http://aspnetresources.com/blog/the_very_handy_using_statement.aspx

Другие вопросы по тегам