C# использование операторов без точки с запятой

Я нашел следующий код онлайн:

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 ..) не заканчивается точкой с запятой. Мой второй вопрос, как правило, после использования мы должны иметь { }, чтобы указать область применения этой переменной, почему в этом случае она отсутствует? и как, когда он будет располагать объект команды?

3 ответа

Решение

Может кто-нибудь объяснить мне, почему использование (SqlCommand ..) не заканчивается точкой с запятой

Потому что команда using будет запускать ровно один блок: следующий. Этот блок может быть только одним утверждением. Если вы ставите точку с запятой в конце, это ничего не изменит (запустите пустую инструкцию).

Это то же самое, что и "если", например.

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

Мой второй вопрос, как правило, после использования мы должны иметь { }, чтобы указать область применения этой переменной, почему в этом случае она отсутствует?

Это не так, посмотрите поближе.

и как, когда он будет располагать объект команды?

Он будет вызывать object.Dispose() (если он не нулевой), когда блок заканчивается (даже если он выдает исключение).

Конструкция using не требует, чтобы оператор заканчивался точкой с запятой.

Конструкция 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. и как, когда он будет располагать объект команды?

Вся концепция использования Statement хорошо объяснена здесь

Другие вопросы по тегам