это, вероятно, лучший шаблон для этого.

л это. Почему явное приведение к IDisposable? Это просто сокращение, чтобы гарантировать, что IDisposable вызывается при выходе из блока using?

using (proxy as IDisposable)
{
  string s = proxy.Stuff()                                    
}

Ответы на вопрос(2)

Это может потребоваться, если вы получилиproxy экземпляр откуда-то и его статический тип не реализуетIDisposable но вы знаете, что реальный тип может подойти, и вы хотите убедиться, что он будет удален, например.

public class Proxy : ISomeInterface, IDisposable
{
    ...
}

private ISomeInterface Create() { ... }

ISomeInterface proxy = Create();

//won't compile without `as`
using(proxy as IDisposable)
{
    ...
}
 Randy Levy14 янв. 2011 г., 23:12
+1 У вас также может быть похожий пример с дженериками.
Решение Вопроса

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

Хорошая вещь оusing директива, это то, что если параметр к немуnullто нет звонкаDispose будет сделано после выхода из сферы действияusing заявление.

Таким образом, код, который вы показали, на самом деле является сокращением для:

var disposable = proxy as IDisposable;
try
{
    string s = proxy.Stuff();
}
finally
{
    if (disposable != null)
        disposable.Dispose();
}

Другими словами, он говорит: «Если этот объект реализует IDisposable, мне нужно избавиться от него, когда я закончу со следующим фрагментом кода».

 Justin14 янв. 2011 г., 22:09
+1 за "если этот объект реализует IDisposable ..."

Ваш ответ на вопрос