C#在这种情况下还会被叫吗?

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语句,如下图所示,我知道Dispose将被调用:

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