#c# #dispose #idisposable #using-statement
#c# #утилизировать #idisposable #using-statement
Вопрос:
Если вы используете предложение using для удаления соединения, удаляются ли другие элементы в предложении, которые реализуют IDisposable, также автоматически? Если нет, то как вы справляетесь с тем, чтобы убедиться, что все IDisposable элементы автоматически удаляются?
public static DataTable ReturnDataTable(
string ConnectionString, string CommandTextString, CommandType CommandType,
int CommandTimeout, List<System.Data.SqlClient.SqlParameter> ParameterList = null)
{
using (System.Data.SqlClient.SqlConnection Connection =
new System.Data.SqlClient.SqlConnection())
{
Connection.ConnectionString = ConnectionString;
System.Data.SqlClient.SqlCommand Command =
new System.Data.SqlClient.SqlCommand();
Command.Connection = Connection;
Command.CommandText = CommandTextString;
Command.CommandType = CommandType;
Command.CommandTimeout = CommandTimeout;
if (ParameterList != null)
{
if (ParameterList.Count > 0)
{
foreach (SqlParameter parameter in ParameterList)
{
Command.Parameters.AddWithValue(
parameter.ParameterName, parameter.Value);
}
}
}
System.Data.DataTable DataTable = new System.Data.DataTable();
System.Data.SqlClient.SqlDataAdapter DataAdapter =
new System.Data.SqlClient.SqlDataAdapter();
DataAdapter.SelectCommand = Command;
DataAdapter.Fill(DataTable);
return DataTable;
}
}
Комментарии:
1. Почему бы вам не использовать другую форму
using
:using System.Data.SqlClient;
?
Ответ №1:
Вы можете сложить инструкции следующим образом (для ранней инициализации всех одноразовых объектов)
using (...)
using (...)
{
...
}
или вы можете использовать вложенные инструкции using для каждого нужного вам одноразового объекта
using (...)
{
using (...) { ... }
using (...) { ... }
}
Ответ №2:
Будет удален только объект, созданный в предложении using. Если вы хотите убедиться, что вызов dispose автоматически генерируется для каждого одноразового объекта, созданного внутри блока using, вам нужно будет обернуть каждый из них в предложение using (или вы можете просто вызвать dispose или close, в зависимости от того, что они поддерживают, конечно). Итак, ответ не таков.
Ответ №3:
Нет. Вам придется явно вызывать Dispose
те, которые не входят в параметры using
инструкции.