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