Почему некоторые строки не имеют точку с запятой в С#?
Я просто пытаюсь понять техническую причину, почему в нижнем ряду некоторые строки не заканчиваются точкой с запятой, но делают другие строки - что это за точка с запятой, которую С# ожидает в некоторых строках, а затем другие....
На самом деле, написав это, я заметил, что для операторов, которые должны иметь фигурные скобки {}, не нужны точки с запятой, но нужны строки, которые сами по себе "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**
}
}
}
}
Ответы
Ответ 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
Составной оператор состоит из нуля или более операторов, заключенных в фигурные скобки ({}). Составной оператор можно использовать везде, где ожидается утверждение. Составные утверждения обычно называются "блоки".
Кудрявые фигурные скобки задают начало и конец составного оператора. Такой компилятор ищет скобки вместо точки с запятой, чтобы определить начало и конец инструкции.