Будет ли использование работать на нуле?
Будет ли работать следующий код, если ресурс не реализует 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