Ответ 1
Нет, двойная двоеточие не требуется. Я немного удивлен, что компилятор не жалуется, что это недостижимое утверждение, но, по-видимому, оно легально. Это не повредит, но в равной степени это не очень хорошая идея.
Я пишу инструкцию и компилируется, но компилятор [VS] никогда не говорит мне, что я поставил точку с запятой два раза.
Это означает, что в ASP.NET MVC 3
return Json(mydata);;
return Json(mydata);
Оба они скомпилируются, но первое неверно в шаблоне проектирования. Почему он не говорит мне о двух точках с запятой.
Если нет причин использовать две точки с запятой, почему бы не показать ошибку?
Если есть специальное использование, пожалуйста, покажите мне, где две точки с запятой необходимы для записи инструкции на С#.
Нет, двойная двоеточие не требуется. Я немного удивлен, что компилятор не жалуется, что это недостижимое утверждение, но, по-видимому, оно легально. Это не повредит, но в равной степени это не очень хорошая идея.
Пустой оператор действителен во всех языках C-производных. Наиболее распространенное идиоматическое использование - в инструкции for, например:
for (; ; )
{
}
если это их специальное использование, тогда покажите мне, где две точки с запятой необходимы для записи инструкции в С#
В приведенном выше примере, конечно, требуются две точки с запятой.
Чтобы разрешить двойной ;;
, по историческим причинам. Это похмелье из языков стиля C (на котором основан С#).
C и С++ имеют концепцию макросов предварительного процессора, которые заменяются в коде перед компиляцией кода, например. тривиальный пример AddAndSquare
- это макрос, а не функция
#define AddAndSquare(X,Y) (X+Y)*(X+Y)
int Foo() {
int a = 1, b = 2;
return AddAndSquare(a, b);
}
переходит к компилятору как
int Foo() {
int a = 1, b = 2;
return (A+B)*(A+B);
}
Вы можете переопределить макросы, отличающиеся от их первоначального определения, также вы можете переопределить их, чтобы они вообще не существовали.
Учитывая макрос утверждения #define ASSERT(c) if(!c) throw new AssertionFailedException()
вы можете закодировать свои кодировки с помощью утверждений ASSERT.
void Foo(int x) {
int y = x + 2;
ASSERT(y != 0);
int z = x / y;
. . . .
}
Теперь подумайте, что вы хотите только утверждать в сборках отладки, но не в выпусках, для выпуска вы переопределяете макрос как пустой (буквально #define ASSERT
). Теперь, когда Foo переходит к компилятору для сборки релиза, он выглядит следующим образом:
void Foo(int x) {
int y = x + 2;
;
int z = x / y;
. . . .
}
Теперь существует пустой оператор, в котором был ASSERT, потому что там может быть или не быть инструкция (в зависимости от конфигурации сборки), компилятор должен иметь возможность обрабатывать пустой оператор.
Почему это соглашение хранилось на С#, где нет ничего, как макросы C
, я понятия не имею, но, возможно, потому, что это причиняет мало или вообще не наносит вреда.
Я бы предположил, что несколько компиляторов ;
выдаются компилятором, прежде чем он начнет синтаксический анализ кода, поэтому ваш недостижимый ;
игнорируется компилятором.
Существует различие между "нет причин использовать их" и "недействительными для их использования". Почему язык должен тратить время и усилия, чтобы запретить вам делать это, когда он безвреден?
; - разделитель операторов. Двойная точка с запятой содержит пустой оператор, которые ничего не делают.
Использование пустой инструкции:
while (Method())
;
или
void F() {
//...
if (done) goto exit;
//...
exit: ;
}
Как вы можете видеть, это правильное поведение. Но в вашем примере у вас будет недостижимый код с пустой инструкцией.
В настоящий момент мне не приходит никакой конкретной причины писать двойную точку с запятой. Насколько я знаю, Visual Studio только жалуется на точки с запятой, что может привести к нежелательному поведению, например следующий фрагмент:
if (true)
;
Поскольку точка с запятой является пустой, целое if-предложение оказывается бесполезным. Visual Studio жалуется на все такие конструкции (используя, for, foreach и т.д.) Без скобок вокруг них.
Итак, следующий код подходит для VS:
if (true)
{
;
}
Компилятор С# не позволяет ;;
между if and else
без привязок, а компилятор будет вызывать ошибку в следующем случае.
if (condition == true)
; ;
else
;
Ошибка компилятора:
Error CS1513 } expected and one warning "Possible mistaken empty statement"
Итак, если вы удалите один semicolon
, он будет работать отлично (или вам нужно добавить фигурные скобки).