C# “的好处是什么?”;使用;

C# “的好处是什么?”;使用;,c#,using,C#,Using,我想了解两者之间的区别 public DataTable ExectNonActQuery(string spname, SqlCommand command) { using (DataTable dt = new DataTable()) { cmd = command; cmd.Connection = GetConnection(); cmd.CommandText = spname; cmd.Command

我想了解两者之间的区别

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

我实际上想了解使用“using”而不是像这样直接创建新对象的好处是什么

DataTable dt = new DataTable();

using
保证在using语句末尾处理对象

您可以改为手动调用.Dispose(),但是使用
,即使您抛出异常,它也会被释放

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

这些都在文档中:

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

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

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


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

您的第一个示例不正确:
使用(var…
确保退出时对
内部声明的变量调用
IDisposable.Dispose
。因此,您的第一个示例返回一个disposed对象,这几乎肯定是错误的

通常,
使用
块大致相当于:

var x = new MyDisposable();
try {
    // Do something with x
} finally {
    x.Dispose();
}
由于这是C#中非常常见的模式,因此为方便起见,我们提供了一种特殊的语法。

来自msdn

定义一个范围,一个或多个对象将位于该范围之外 处置

您不必担心如何处理所用对象的内存/资源。using语句将处理这个问题。一旦控件退出
using
语句外部块(范围),using块内定义的变量将自动处理

典型的例子是SQL连接。通常,您必须在事务完成后通过调用close方法显式关闭连接。但是通过使用statmenet,您不必担心这一点,它会得到注意的

每当CLR决定执行垃圾收集时,CLR通常都会释放内存。。通过使用
using
语句,我们正在释放手动使用的内存/资源

using (DataTable dt = new DataTable())
等于

DataTable dt = new DataTable();
try
{
}
finally 
{
    if(dt != null)
        dt.Dispose()
}
因此,在这种情况下,如果抛出任何异常,您的datatable对象将被释放。
在您不使用它的情况下,只有在为DataTable类定义了终结器的情况下,垃圾收集器才会收集它,并且在使用
using
语句时,您创建的对象不会有任何不同

using语句只包装继承IDisposable的对象。你打字的时候

使用(DataTable dt=newdatatable()){}

DataTable dt=newdatatable()
的返回值是对dt的引用,它进入using语句

所以这也可以写成

DataTable dt = new DataTable();
using (dt) { }

使用声明的原因,如其他答案所述,变量所持有的资源可以在垃圾收集器正常释放它们之前释放。

在using中声明一个类型需要一个类型来实现IDisposable,这样一旦对象的定义范围结束,该对象就可以借助该类型中定义的disposed方法得到清理

这确实非常有趣,因为编译器本身将使用转换为try..Finally语句,就像它将常量转换为它们的值一样。因此,在运行时使用&try..finally的行为是相同的:)

使用以下链接更深入地了解:


我希望这会有所帮助。

您是否阅读了有关的文档?如果是的话,你的问题是什么?对于数据表,差异为零。但是DataTable是这方面极少数的例外之一。你说的disposed brother是什么意思?你能告诉我,如果我使用问题的第一个例子而不是2nd@kashif:另请参见dasblinkenlight对第一个示例中得到的内容的回答。这种情况没有什么好处
DataTable dt = new DataTable();
using (dt) { }