Будет ли использование работы по 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
Ответ 8
Я считаю, что компилятор добавляет проверки, чтобы определить, является ли оно нулевым, прежде чем пытаться вызвать Dispose.
http://aspnetresources.com/blog/the_very_handy_using_statement.aspx