【发布时间】:2013-06-19 19:48:04
【问题描述】:
例如:在方法中创建它并将其分配给一个字段。将该字段传递给方法,然后将其分配给 using 语句的变量(这是唯一被调用的 Dispose)。
SqlCommand CreateSqlCommand()
{
SqlCommand cmd1 = new SqlCommand();
return cmd1;
}
void UseSqlCommand(SqlCommand cmd4)
{
using (SqlCommand cmd3 = cmd4)//Is this using-statement enough?
{
//use cmd3 here...
}
}
并使用:
SqlCommand cmd2 = CreateSqlCommand();
UseSqlCommand(cmd2);
额外细节:GC 是否会在下一轮收集所有这些变量?为什么不呢 - 请参阅 David M. Kean 的回答 here。
编辑
我已经添加了
cmd2.CommandText = "";
在前(最后)行之后。并且没有抛出任何错误。
为什么?它应该已经被处理掉了! 没关系。可以引用已处置的对象...
请不要专注于示例,而应专注于问题本身。谢谢。
【问题讨论】:
-
这看起来真的很糟糕。假设 CLR 将在
using块的末尾调用Dispose(),您将有一些cmd4对象引用指向一个已处置的对象。请不要那样做。 -
同意;您必须检查它是否没有像 HighScore 所说的那样每次都被丢弃。
-
@HighCore 我正在尝试创建一种方法来执行任何命令。所以它接收到一个已经创建的命令。
-
@HighCore
cmd4只出现了两次。cmd2也是如此。 -
@ispiro 你不明白,是吗?变量名无关紧要。您的对象实例来自其他地方,您的方法正在调用
Dispose()。调用此方法的任何其他方法都将处理此实例。这很容易出现异常。
标签: c# .net sql idisposable sqlcommand