2013-06-25 3 views
1

Я написал этот кодПростой синтаксис для IDisposable, чем использование блока?

var doc = new StreamReader(stream).ReadToEnd(); 

Но потом я вспомнил, следует использовать с помощью блока C# 's, чтобы убедиться, что очистка методом в StreamReader в Dispose называется как можно скорее. Это дало мне этот код

string doc; 
using (var reader = new StreamReader(stream)) 
{ 
    doc = reader.ReadToEnd(); 
} 

Это длиннее и труднее читать. Есть ли более простой синтаксис одной строки, который все еще правильно обрабатывает IDisposable?

+6

"Дайте им дюйм ...": -) Синтаксический сахар для синтаксического сахара? Здесь ничего нет. – Jon

+2

Используйте и не изобретайте велосипед. –

+0

Насколько короче вы этого хотите? Это уже довольно коротко ... – thecoop

ответ

0

Вы можете вызвать метод Dispose вручную, как это:

var reader= new StreamReader(stream); 

try 
{ 
    var doc = reader.ReadToEnd(); 
} 
finally 
{ 
    reader.Dispose(); 
} 

который фактически эквивалентном с использованием синтаксиса. Но использование по-прежнему является самым коротким способом его написания.

+3

Этого не хватает для 'use', то есть: исключения могут быть сброшены. – Jon

+0

Добавить 'try/finally' и больше не выигрывать ... – Pragmateek

+0

Спасибо за советы по поводу исключений. Это совершенно правильно. Я отредактировал свой ответ. – studert

0

Операции № 3 обычно требуют 3 строчек .. особенно если каждая операция возвращает что-то.

У вас есть несколько вариантов:

  1. Все на одной линии.
  2. Явно называть Dispose().
  3. using .. как было задумано :)

Если дополнительные линии является то, что вы беспокоитесь о .. ты беспокоишься о неправильных вещах.

2

С только одна линия внутри блока вы можете просто написать

using (var reader = new StreamReader(stream)) 
    doc = reader.ReadToEnd(); 

Однако нет никакого способа, чтобы упростить это дальше. using лишь некоторые синтаксический сахар для чего-то вроде этого:

var reader = new StreamReader(stream); 

try 
{ 
    doc = reader.ReadToEnd(); 
} 
finally 
{ 
    reader.Dispose(); 
} 

И это даже не мешает вам получить доступ к объекту после того, как он был удален. Таким образом, using - это на самом деле короткий путь, чтобы выполнить работу.

Одно замечание об объединении using -statements: Если вы работаете с FileStream и StreamReader/StreamWriter, вы можете просто объединить много using -statements к одному:

using (var stream = new FileStream(@"C:\Test.txt", FileMode.Open, FileAccess.Read)) 
using (var reader = new StreamReader(stream)) 
{ 
    doc = reader.ReadToEnd(); 
}