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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

Да. Оператор using проверяет, предоставляется ли ему null и позволяет избежать вызова Dispose, если это так.

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

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

Ответ 3

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

IDisposable o = ...;

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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