Очень простой философский вопрос …
Почему не запрещено (на этапе компиляции), создание экземпляра класса
реализующего интерфейс IDisposable, вне конструкции using?
Примеры:
// 1. ссылка не стеке (контролируем); ОК
using(StreamReader sr = new StreamReader(...))
return sr.ReadToEnd();
// 2. ссылка не стеке (контролируем); FAIL
StreamReader sr = new StreamReader(...);
return sr.ReadToEnd();
// 3. ссылка в упр. куче (неконтролируем); OK
StreamReader[] arr = new StreamReader[10];
for(int i = 0; i < 10; i++)
arr[i] = new StreamReader(...);
// 4. странный пример, возможно ислючение из общего
// правила контроля ссылок на стеке; OK
object o = new StreamReader(...);
Накладные расходы не велики, и уберегает начинающих программистов,
от множества проблем связанных, например, с некорректным освобождением ресурсов
(в случае RAII).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>