"使用"有什么好处

kas*_*hif 5 c# using

我想了解它们之间的区别

public DataTable ExectNonActQuery(string spname, SqlCommand command)
{
    using (DataTable dt = new DataTable())
    {
        cmd = command;
        cmd.Connection = GetConnection();
        cmd.CommandText = spname;
        cmd.CommandType = CommandType.StoredProcedure;
        da.SelectCommand = cmd;
        da.Fill(dt);
        return (dt);
    }
}
Run Code Online (Sandbox Code Playgroud)

public DataTable ExectNonActQuery(string spname, SqlCommand command)
{
    DataTable dt = new DataTable();
    cmd = command;
    cmd.Connection = GetConnection();
    cmd.CommandText = spname;
    cmd.CommandType = CommandType.StoredProcedure;
    da.SelectCommand = cmd;
    da.Fill(dt);
    return (dt);
    }
}
Run Code Online (Sandbox Code Playgroud)

我实际上想要了解使用"使用"创建新对象的好处,而不是像这样直接创建它

DataTable dt = new DataTable();
Run Code Online (Sandbox Code Playgroud)

das*_*ght 16

您的第一个示例是错误的:using(var ...)确保在退出时IDisposable.Dispose在内部声明的变量上调用它using.因此,你的第一个例子返回一个配置对象,这几乎肯定是错误的.

一般来说,using块大致相当于:

var x = new MyDisposable();
try {
    // Do something with x
} finally {
    x.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

由于这是C#中非常常见的模式,因此为方便起见提供了特殊语法.


Hug*_*une 11

using 保证将对象放置在using语句的末尾

您可以手动调用.Dispose(),但是using,即使您抛出异常,它也会被处理掉

并且您可以避免自己的错误,例如忘记调用.在调用Dispose之前,请暂停或重新分配变量.

这些都在文档中:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

编辑:另外,正如dasblinkenlight在另一个答案中解释的那样,当你从一个函数返回一个对象时处理它是一个坏主意

但是,在DataTable,DataSet和DataView的特殊情况下,您实际上并不需要处理这些对象,因此在此特定示例中,可以安全地忽略DataTable是IDisposable.此外,由于DataTable的.Dispose()方法明确地不执行任何操作(Finalization被抑制),因此尽管返回已处置的对象,但您的第一个示例应该实际工作.

请参阅我应该Dispose()DataSet和DataTable?

因此,在您的特定示例中,实际差异可能为零.

在任何可行的情况下,使用Using语句包装IDisposable仍然是一种很好的做法.(如果必须在函数内构造一个对象,然后在该函数外部访问,则这是不可能的.)