我想了解它们之间的区别
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仍然是一种很好的做法.(如果必须在函数内构造一个对象,然后在该函数外部访问,则这是不可能的.)