Подтвердить что ты не робот

Почему некоторые строки не имеют точку с запятой в С#?

Я просто пытаюсь понять техническую причину, почему в нижнем ряду некоторые строки не заканчиваются точкой с запятой, но делают другие строки - что это за точка с запятой, которую С# ожидает в некоторых строках, а затем другие....

На самом деле, написав это, я заметил, что для операторов, которые должны иметь фигурные скобки {}, не нужны точки с запятой, но нужны строки, которые сами по себе "Console.WriteLine".

На самом деле пытаюсь найти технические причины для этого...

т

namespace checkPackage     **//no semicolon**
{
    class Program      **//no semicolon**
    {
        static void Main(string[] args)     **//no semicolon**
        {
            listFilesInDirectory(@"C:\Temp\");    **//NEEDS a semicolon**
        }

        static void listFilesInDirectory(string workingDirectory)   **//no semicolon**
        {
            string[] filePaths = Directory.GetFiles(workingDirectory);  **//NEEDS a semicolon**

            foreach (string filePath in filePaths)   **//no semicolon**
            {
                Console.WriteLine(filePath);  **//NEEDS a semicolon**
            }

        }
    }
}
4b9b3361

Ответ 1

Полу-двоеточие не является терминатором строки... это терминатор утверждения. В конце каждой инструкции выражения и утверждения есть полу-двоеточие.

(if, for etc заявления не являются выражениями или заявлениями декларации.)

Итак, например:

public class Foo // Part of a class declaration
{
    int x = 0; // Declaration statement

    public void Bar() // Part of a method declaration
    {
        Console.WriteLine(x); // Expression statement (using an invocation expression)
    } // End of the method declaration, but not a declaration statement 

} // End of class declaration, but not a declaration statement

Цель их требования заключается в том, что компилятор может сказать, когда вы хотите закончить оператор, а не продолжать на следующей строке:

 int x = 5;
 int y = x // This isn't the end of the statement!
         + 5; // This is...

Одна альтернатива (например, VB) заключается в продолжении строки, в которой вы хотите явно перейти к следующей строке, даже если текущая строка будет действительным.

Как отмечено в комментариях, оператор do является аномалией здесь. Я не вижу очевидной причины, почему это не должно быть правдой:

do { } while (false)

... но это не так. Это может быть связано с тем, что для простого выражения while требуется тело оператора, например. while (true); (пустой оператор) или while (true) {} (оператор блока). Самое близкое, что я могу найти, - "потому что спецификация С# говорит, что инструкция do нуждается в полутоле в конце..."

Ответ 2

Причина? Потому что спецификация говорит так:

Оператор может состоять из одной строки кода, которая заканчивается точка с запятой или ряд однострочных операторов в блоке. блок оператора заключен в {} скобки и может содержать вложенные блоки.

За определением foreach следует инструкция, которая должна быть заключена в {} или заканчиваться точкой с запятой. Этот оператор далее упоминается как тело петель.

Это не может быть адекватным ответом на вопрос "почему". Чтобы углубиться в это, вам действительно нужно спросить дизайнеров. Я полагаю, они хотели сделать это ближе к C-синтаксису, в отличие от других языков, где разрыв линии служит аналогичной цели. (Python iirc)

Если вы хотите более формальное определение, загрузить спецификацию языка С# и прочитать раздел 1.2 до 1.5.

Ответ 3

Существует два типа statements, простые утверждения и составные выражения. Объявления циклов и методов являются составными операторами. Каждый простой оператор заканчивается точкой с запятой, но составные выражения не заканчиваются точкой с запятой. Из msdn

Составной оператор состоит из нуля или более операторов, заключенных в фигурные скобки ({}). Составной оператор можно использовать везде, где ожидается утверждение. Составные утверждения обычно называются "блоки".

Кудрявые фигурные скобки задают начало и конец составного оператора. Такой компилятор ищет скобки вместо точки с запятой, чтобы определить начало и конец инструкции.