Будет ли работать следующий код, если ресурс не реализует IDisposable?
T resource = new T();
using (resource as IDisposable)
{
...
}
Будет ли работать следующий код, если ресурс не реализует IDisposable?
T resource = new T();
using (resource as IDisposable)
{
...
}
Да, это сработает, проверьте этот текущий тест:
[TestMethod]
public void TestMethod8()
{
using (new MyClass() as IDisposable)
{
}
}
public class MyClass { }
Он запускается без каких-либо проблем. Если соответствующий класс реализует IDisposable, он будет вызывать его, если он еще не будет работать/запускаться:).
Обновление: Как говорили другие, я также задаюсь вопросом, какое использование вы хотите ему дать. Я предполагаю, что у вас есть что-то вроде factory, который может получать экземпляры из разных классов, которые могут быть или не быть одноразовыми:).
Да. Оператор using
проверяет, предоставляется ли ему null
и позволяет избежать вызова Dispose
, если это так.
Из раздела 8.13 спецификации С# 3:
Оператор using используется в три части: приобретение, использование и удаление. Использование ресурса неявно заключенный в заявлении try который включает в себя предложение finally. Эта наконец, ресурс. Если нулевой ресурс, то вызов Dispose и исключение не исключено.
Он должен работать нормально, даже если это не "правильный" подход к утилизации ресурсов. Статус using
- это просто синтаксический сахар для
IDisposable o = ...;
try
{
// ...
}
finally
{
if (o != null)
o.Dispose(true);
}
Итак, если o никогда не реализовал IDisposable
, он был бы нулевым в инструкции using
, и он попытался бы вызвать Dispose
на нем.
При тестировании кода оно не приводит к ошибкам компиляции или времени выполнения.
Из определения языка (см. раздел 8.13): -
Если нулевой ресурс получен, тогда вызов Dispose не производится, и нет исключение.
Если тип не конвертируется в IDisposible, оператор as переводит ресурс в null, а код, инкапсулированный в блок использования, будет выполняться совершенно нормально, и он будет вести себя точно так же, как если бы вы не вложили его в блок использования.
Короче говоря, ответ на ваш вопрос - да.
Если "работает ли это", вы имеете в виду, что вы получите ошибку времени выполнения? Нет, вы не будете.
Какое использование этого? Какое преимущество? Какая польза?
Оператор using будет убедиться, что вызывается метод Dispose, но если ваш объект не реализует IDisposable, я не вижу смысла делать это? Он будет работать (как в, он не будет бросать исключения во время выполнения, и он будет компилироваться), я только что протестировал его здесь, но...
С кодом, который вы записали, вы даже не можете использовать ресурс как IDisposable...
Это может быть полезно, когда тип явно реализует IDisposable, и в этом случае метод Dispose недоступен непосредственно по типу, если только тип не был добавлен к IDisposable, использование "as" делает безопасный листинг и гарантирует, что Dispose вызывается, В большинстве случаев, когда тип явно реализует IDisposable, он предоставляет такие методы, как "Close", который, в свою очередь, вызывает Dispose
Я считаю, что компилятор добавляет проверки, чтобы определить, является ли оно нулевым, прежде чем пытаться вызвать Dispose.
http://aspnetresources.com/blog/the_very_handy_using_statement.aspx