2016-09-23 3 views
2

Я просматриваю некоторый код C#, и это было некоторое время, так как я работал с C#, поэтому я хотел быть уверенным, что мои инстинкты верны. В этом коде я вижу число мест внутри с помощью блока, где делается что-то вроде следующего:C# using clear dispose

using(StreamWriter thing = new StreamWriter()) { 

    DataSet DS = SQLQueryMethod(); 
    do stuff to DS and log that stuff to the a log file using thingy... 

    DS.clear(); 
    DS.Dispose(); 
} 

Теперь, я сделал немного исследований по этому вопросу, а также посмотрел несколько лет назад через мой провал попытки и я думаю, что есть несколько способов сделать это, чтобы было лучше. Я хотел бы узнать, какой из них более «стандартный»/«лучший pactice». Я думаю, что число 1 ниже - лучший способ сделать это.

благодарит заранее.

  1. Добавьте DataSet в использовании заявления так, что он получает, расположенные автоматически с концом рамки с помощью заявления, отпадет необходимость как ясно и распоряжаться. Я хотел бы сделать это:

    using(StreamWriter thing = new StreamWriter(), DataSet DS = new DataSet()) { 
    
        DS = SQLQueryMethod() 
        do stuff to DS{...} 
    
    } 
    
  2. Просто вызовите Dispose на DataSet DS, так как я думаю, что расчистке это только до принятия распоряжаются бесполезно.

  3. На самом деле это необходимо сделать оригинальным способом.

+0

Этот вопрос, вероятно, принадлежит к http://codereview.stackexchange.com, но ответить на ваш вопрос, да, да, да, но я до сих пор думаю, что вам нужно 2 seperate usings –

+0

Как только я вижу '.Dispose()' в методе, создающем экземпляр этого же объекта, я всегда сжимаюсь и вижу, как переписать его в шаблон 'use', который почти всегда легко прост. –

+0

Я вижу несколько ответов с несколькими операторами using вместо добавления нескольких элементов в один оператор using, есть ли разница между ними? Пример: использование (Itema, itemB) { } против использования (Itema) использования (itemB) { } –

ответ

6

Multiple "с помощью заявления" можно использовать следующим образом:

using (StreamWriter thing = new StreamWriter()) 
using (DataSet DS = new DataSet()) 
{ 
    DS = SQLQueryMethod(); 
    //do stuff .... 
} 

Поскольку StreamWriter и DataSet реализует необходимый метод Dispose() метод в интерфейсе IDisposable, не нужно явно вызывать его после

+4

Вы можете даже использовать '(DataSet DS = SQLQueryMethod())', если вы хотите сохранить одну строку –

+2

Почему каждый объявляет 'новый DataSet()' в ответах? Не поддерживает ли инструкция 'using' исходную ссылку? – flakes

+2

@flkes - Я тоже этого не понимаю - это не скомпилируется :) –

0

Правильный способ утилизации всего, что реализует IDisposable - например

using (var thing = new StreamWriter()) 
using (var ds = SQLQueryMethod()) 
{ 
    do stuff to DS {} 
} 

Другие предлагаемые ответы неверны

using(StreamWriter thing = new StreamWriter()) 
using(DataSet DS = new DataSet()) 
{ 
    // this won't compile - DS is in using so it is a read-only variable 
    DS = SQLQueryMethod() 
    do stuff to DS{...} 
} 

Ссылка: Why is a variable declared in a using statement treated as readonly?

+0

Вопрос касался использования usings и IDisposable. – alexqc

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