Предоставляет ли С# двойную точку с запятой;; если да, есть ли какие-то особые способы?

Я пишу инструкцию и компилируется, но компилятор [VS] никогда не говорит мне, что я поставил точку с запятой два раза.

Это означает, что в ASP.NET MVC 3

return Json(mydata);;

return Json(mydata);

Оба они скомпилируются, но первое неверно в шаблоне проектирования. Почему он не говорит мне о двух точках с запятой.

Если нет причин использовать две точки с запятой, почему бы не показать ошибку?

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

Ответы

Ответ 1

Нет, двойная двоеточие не требуется. Я немного удивлен, что компилятор не жалуется, что это недостижимое утверждение, но, по-видимому, оно легально. Это не повредит, но в равной степени это не очень хорошая идея.

Ответ 2

Пустой оператор действителен во всех языках C-производных. Наиболее распространенное идиоматическое использование - в инструкции for, например:

for (; ; )
{
}

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

В приведенном выше примере, конечно, требуются две точки с запятой.

Ответ 3

Чтобы разрешить двойной ;;, по историческим причинам. Это похмелье из языков стиля 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, я понятия не имею, но, возможно, потому, что это причиняет мало или вообще не наносит вреда.

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

Ответ 4

Существует различие между "нет причин использовать их" и "недействительными для их использования". Почему язык должен тратить время и усилия, чтобы запретить вам делать это, когда он безвреден?

Ответ 5

; - разделитель операторов. Двойная точка с запятой содержит пустой оператор, которые ничего не делают.

Использование пустой инструкции:

while (Method())
   ;

или

void F() {
   //...
   if (done) goto exit;
   //...
   exit: ;
}

Как вы можете видеть, это правильное поведение. Но в вашем примере у вас будет недостижимый код с пустой инструкцией.

Ответ 6

В настоящий момент мне не приходит никакой конкретной причины писать двойную точку с запятой. Насколько я знаю, Visual Studio только жалуется на точки с запятой, что может привести к нежелательному поведению, например следующий фрагмент:

if (true)
    ;

Поскольку точка с запятой является пустой, целое if-предложение оказывается бесполезным. Visual Studio жалуется на все такие конструкции (используя, for, foreach и т.д.) Без скобок вокруг них.

Итак, следующий код подходит для VS:

 if (true)
 {
      ;
 }

Ответ 7

Компилятор С# не позволяет ;; между if and else без привязок, а компилятор будет вызывать ошибку в следующем случае.

if (condition == true)
                ; ; 
            else
                ;

Ошибка компилятора:

Error   CS1513  } expected  and one warning "Possible mistaken empty statement"

Итак, если вы удалите один semicolon, он будет работать отлично (или вам нужно добавить фигурные скобки).