2009-04-01 4 views
13

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

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

, но ... зачем вы это делаете? –

+1

Я думаю, что вопрос верен, и я не понимаю, почему кто-то его понизил. – alex

ответ

10

Да, он будет работать, проверить этот ход тест:

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

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

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

1

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

1

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

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

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

+0

@Frederik добавил к моему ответу: моя догадка - фабрика, которая может получить вам экземпляры из разных классов, которые могут быть или не быть одноразовыми. – eglasius

16

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

Из раздела 8,13 на C# 3 спецификации:

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

2

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

IDisposable o = ...; 

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

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

+0

@Samuel добавил к моему ответу: моя догадка - это фабрика, которая может получить вам экземпляры из разных классов, которые могут быть или не быть одноразовыми. – eglasius

2

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

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

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

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

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^