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