C#“使用”陈述问题

发布于 2024-11-03 07:23:30 字数 1448 浏览 6 评论 0原文

如果使用 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;
    }
}

If you employ a using clause to dispose of a connection, are other items within the clause that implement IDisposable also automatically disposed? If not, how do you handle making sure all IDisposable items are automatically disposed?

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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

初雪 2024-11-10 07:23:30

您可以像这样堆叠语句(以尽早初始化所有一次性对象),

using (...)
using (...)
{
  ...
}

或者可以对您需要的每个一次性对象使用嵌套的 using 语句

using (...)
{
   using (...) { ... }
   using (...) { ... }
}

You can stack the statements like this (to initialize all disposable objects early on)

using (...)
using (...)
{
  ...
}

or you can use nested using statements for each disposable object you need

using (...)
{
   using (...) { ... }
   using (...) { ... }
}
奢华的一滴泪 2024-11-10 07:23:30

只有在 using 子句中创建的对象才会被释放。如果您想确保为 using 块内创建的每个一次性对象自动生成对 dispose 的调用,您将需要将每个对象包装在 using 子句中(或者您可以只调用 dispose 或 close,无论它们支持哪个)课程)。所以,答案是否定的。

Only an object created in the using clause will be disposed. If you want to make sure that call to dispose is automatically generated for every disposable object created inside of the using block you will need to wrap each of them in a using clause (or you can just call dispose or close, whichever they support, of course). So, the answer is not.

软甜啾 2024-11-10 07:23:30

不可以。您必须对 using 语句参数之外的参数显式调用 Dispose

No. You will have to explicitly call Dispose on the ones that are not inside the parameters of the using statement.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文