C#在这种情况下还会被叫吗?
以下代码是否相同,例如仍将被调用 如果我使用using语句,如下图所示,我知道Dispose将被调用:C#在这种情况下还会被叫吗?,c#,dispose,using,idisposable,C#,Dispose,Using,Idisposable,以下代码是否相同,例如仍将被调用 如果我使用using语句,如下图所示,我知道Dispose将被调用: using (SqlCommand cmd = new SqlCommand(procedureName, sqlConnection)) { cmd.CommandType = CommandType.StoredProcedure; if (sqlParams != null) cmd.Parameters.AddRange(sqlParams.ToArray(
using (SqlCommand cmd = new SqlCommand(procedureName, sqlConnection))
{
cmd.CommandType = CommandType.StoredProcedure;
if (sqlParams != null)
cmd.Parameters.AddRange(sqlParams.ToArray());
SqlDataReader rdr = cmd.ExecuteReader();
return rdr;
}
我的问题是,这实际上是同一件事吗:
SqlCommand cmd = new SqlCommand(procedureName, sqlConnection)
using (cmd)
{
cmd.CommandType = CommandType.StoredProcedure;
if (sqlParams != null)
cmd.Parameters.AddRange(sqlParams.ToArray());
SqlDataReader rdr = cmd.ExecuteReader();
return rdr;
}
是-当代码退出using()块时,可以调用Dispose()的任何内容都将被自动处理,包括在上面给出的示例中。现在您可以决定:) 输出:
内部使用block--Test命令 外部使用block--Test命令 为更清晰起见,更新了:
Dispose肯定会被调用,这两个示例的区别在于,第二个示例中,您可以访问using块中对象设置的属性。为什么不通过调试来尝试呢?它不是一个神秘的黑匣子。您可以阅读并意识到,在第二个示例中,
cmd
只是一个(非常简单的)表达式。@HimBromBeere这是一个公平的观点。我不能进入这个类,但在我发布了这个问题后,我在另一个类中这样做了,我知道它确实调用了dispose。只要你不使用在创建和之间放置任何代码,那么这应该很好,但是如果你确实在他们之间放了什么东西,并且抛出了一个异常,那么它就不会被处理。你的答案是正确的,但是洛普帕兹是第一个,所以我把他标记为正确的。我投了你的票,但这不能证明是否有人打电话给你。Dispose通常用于处置非托管资源。CommandText是字符串,而不是非托管资源。Dispose被调用。我试图强调两个示例的区别,第一个示例不能在块外使用同一对象的commandText或其他属性。同意的话,我会打电话给你。
SqlCommand cmd = new SqlCommand();
using(cmd)
{
cmd.CommandText = "Test command";
Console.WriteLine("Inside using block-- " +cmd.CommandText);
}
Console.WriteLine("Outside using block --" +cmd.CommandText);
Console.ReadKey();