2012-04-27 3 views
0

Не могли бы вы объяснить, что здесь происходит?Использование нескольких операторов-операторов для размещения DataSet и DataTables

using(DataSet ds = GetDataSet()) // will this get disposed? if yes (when?) 
{ 
    using(DataTable dt = ds.Tables[0]) /* in this line is ds available for dt? i found some issue with this kind of statement. dt gets null after this line */ 
    { 
      // i know that ds is available here. 
      //some code 
    } 
} 
+0

ds должно быть доступно для всех строк кода до закрывающей скобки использования, если я не ошибаюсь –

ответ

1
using(DataSet ds = GetDataSet()){ 

    using(DataTable dt = ds.Tables[0]) 
    // dt will be NULL if there are no tables in ds 
    { 
    // both dt & ds will be available here 

    }// dt will get disposed 

}// ds will be disposed at this point... 

Эквивалентный код для этого:

try{ 
DataSet ds = GetDataSet(); 
try{ 
    DataTable dt = ds.Tables[0]; 
    // dt will not be null if there are any tables in ds 
    // Both ds & dt available here... 
} 
finally{ 
    dt.Dispose(); 
} 
} 
finally{ 
ds.Dispose(); 
} 
0

using() оператор принимает любое IDisposable и будем называть Dispose() на ней, когда она Прицел вышла либо с помощью исключения или обычного исполнения.

Таким образом, dt будет расположен сначала, когда она проходит внутреннее закрытие }, а затем ds будет расположен, когда наружный закрытия «}` передается:

using(DataSet ds = GetDataSet()) 
{ 
    using(DataTable dt = ds.Tables[0]) 
    { 
     .... 
    } // <-- dt disposed here or if unhandled exception thrown 

} // <-- ds disposed here or if unhandled exception thrown. 

Для получения дополнительной информации см MSDN section on the Using statement

0

Да, он будет удален после того, как вы покинете соответствующий кронштейн. Использование вызовов dispose и его можно использовать только с объектами, которые реализуют IDisposable.

+0

В опубликованном коде отсутствует закрытие: http://en.wikipedia.org/wiki/Closure_ (computer_science) – Andreas

+0

Да, я плохо, я использовал слово «закрытие», чтобы описать {} – Katu

0

using statment здесь:

using (ResourceType resource = expression) { ... } 

эквивалентно:

ResourceType resource = expression; 
try { 
    ... 
} 
finally { 
    if (resource != null) ((IDisposable)resource).Dispose(); 
} 

(если ResourceType является типом значения , нулевая проверка wi будет опущено).

Так что в вашем случае первое использование подразумевает, что GetDataSet() создает новый набор данных, который позже никто не будет использовать. Во-вторых, using не имеет большого смысла - вам не нужно избавляться от таблиц набора данных, насколько я знаю.

Причина, по которой вы получаете нуль dt, может заключаться в том, что в коллекции Tables нет ничего.

0

думаю так:

using resource

ваш resource будет жить здесь и будут доступны для всех остальных детей «с помощью» заявления или другие методы

end of using

так вопросы :

ds будет утилизирован в конец первого using блока

dt получит первый DataTable найти в ds и будет захоронен в конце своего собственного using блока

Это происходит потому, что using заявление, в этой форме всегда будет вызывать Dispose метод ресурса это управление, поэтому, вы можете использовать только using блок для типов, реализующих IDisposable

1

Да, ds будет расположена на последнем закрывающую скобку в вашей выборке. Да, ds доступен, когда вы строите dt. Причина dt идет, так как null должен просто быть ds.Tables[0] возвращает null. Из documentation значение null означает, что DataTable, которого вы ищете, не существует. Я предполагаю, что DataSet не заполняется значениями. См. Документацию для an example.

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