C# 使用不带分号的语句

本文关键字:语句 | 更新日期: 2023-09-27 17:55:20

我在网上找到了以下代码:

using (SqlConnection con = new SqlConnection(connectionString))
    {
        //
        // Open the SqlConnection.
        //
        con.Open();
        //
        // The following code uses an SqlCommand based on the SqlConnection.
        //
        using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1", con))
        using (SqlDataReader reader = command.ExecuteReader())
        {
        while (reader.Read())
        {
            Console.WriteLine("{0} {1} {2}",
            reader.GetInt32(0), reader.GetString(1), reader.GetString(2));
        }
        }
    }

谁能解释我为什么使用(SqlCommand..) 不以分号结尾。我的第二个问题是,通常在使用后,我们必须有 { } 来指示使用变量的范围,为什么在这种情况下它丢失了?以及如何,何时释放命令对象?

C# 使用不带分号的语句

谁能解释为什么使用 (SqlCommand ..) 不以分号结尾

因为 using 命令将只运行一个块:后面的那个。该块只能是一个语句。如果在末尾加上分号,它将不执行任何操作(运行空语句)。

例如,"if"的情况也是如此。

if(a==b)
   Console.Write("they are equal!");
Console.Write("I'm outside the if now because if only runes one block");

if(1==2);
Console.Write("I will always run because the if ends with a semicolon! (executes an empty statement)");

我的第二个问题是通常在使用后我们必须有 { } 到 使用变量指示其范围,为什么在这种情况下它丢失了?

不是,仔细看。

以及如何,何时释放命令对象?

它将调用对象。Dispose()(如果它不是空的)当块结束时(即使它抛出异常)。

using 构造不要求语句以分号结尾。

使用 构造会自动确保您的对象得到正确处置。

如果 {} 不存在,则范围是下一条语句。 在您的情况下,这是使用(SqlReader...)的整个块,因为它的范围为 {}

  1. 谁能解释为什么使用 (SqlCommand ..) 不以分号结尾。

像 Using、If、For 和 Foreach 这样的关键字不需要 ; 来标记结尾因为它还没有结束!你永远不会发现这样的代码有用。

If(true);//This is totally meaningless code
Console.WrtieLine("Hello world!");
  1. 我的第二个问题是,通常在使用后,我们必须有 { } 来指示使用变量的范围,为什么在这种情况下它丢失了?

因为在这种情况下可以安全地确定外部使用块的范围。

using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1", con))
using (SqlDataReader reader = command.ExecuteReader())

同样你也可以写

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 2; j++)
    {
        Console.WriteLine(string.Format("i = {0}, j ={1}",i, j));
    }
//i and j are no longer accessible from this line after
//because their scopes ends with the }
  1. 以及如何,何时释放命令对象?

使用语句的整个概念在这里得到了很好的解释