Точки с запятой в C#

Кроме того, вы, вероятно, захотите перенаправить пользователя к указанному в URL-адресе заголовков. Итак, это будет выглядеть так:

$.ajax({
    //.... other definition
    complete:function(xmlHttp){
        if(xmlHttp.status.toString()[0]=='3'){
        top.location.href = xmlHttp.getResponseHeader('Location');
    }
});

UPD: Opps. Иметь ту же задачу, но она не работает. Делать это. Я покажу вам решение, когда найду его.

32
задан Dana 7 March 2009 в 18:51
поделиться

11 ответов

Символ разделителя строки заставит Вас смочь повредить оператор через несколько строк.

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

40
ответ дан 27 November 2019 в 20:03
поделиться

Нет, компилятор не знает, что разрыв строки для завершения оператора, ни если он. Это позволяет Вам нести оператор к мультилиниям, если Вам нравится.

См.:

string sql = @"SELECT foo
               FROM bar
               WHERE baz=42";

Или как насчет больших перегрузок метода:

CallMyMethod(thisIsSomethingForArgument1,
             thisIsSomethingForArgument2,
             thisIsSomethingForArgument2,
             thisIsSomethingForArgument3,
             thisIsSomethingForArgument4,
             thisIsSomethingForArgument5,
             thisIsSomethingForArgument6);

И реверс, точка с запятой также позволяет составные строки:

string s = ""; int i = 0;
15
ответ дан 27 November 2019 в 20:03
поделиться

Сколько операторов это?

for (int i = 0; i < 100; i++) // <--- should there be a semi-colon here?
Console.WriteLine("foo")

Точки с запятой необходимы для устранения неоднозначности.

12
ответ дан 27 November 2019 в 20:03
поделиться

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

7
ответ дан 27 November 2019 в 20:03
поделиться

Я лично соглашаюсь с наличием отличного символа как разделитель строки. Это делает намного легче для компилятора выяснить то, что Вы пытаетесь сделать.

И вопреки широко распространенному мнению это не возможные 100% времени к тому, чтобы компилятор выяснил, где один конец оператора и другой начинают без помощи! Существуют пограничные случаи, где это неоднозначно, является ли это отдельным оператором или несколькими операторами, охватывающими несколько строк.

Прочитайте эту статью от Paul Vick, технического руководителя Visual Basic для наблюдения, почему не столь легкий, как это звучит.

4
ответ дан 27 November 2019 в 20:03
поделиться

Строго говоря это верно: если человек мог бы выяснить, где оператор заканчивается, компиляторе - также. Это еще действительно не завоевало популярность, и немного языков реализуют что-либо того вида. Следующая версия VB, вероятно, будет первым языком, который реализует правильное обращение операторов, которые не требуют ни явного завершения, ни продолжения строки [источник]. Это позволило бы код как это:

Dim a = OneVeryLongExpression +
        AnotherLongExpression
Dim b = 2 * a

Давайте держать пальцы скрещенными.

С другой стороны, это действительно делает парсинг намного тяжелее и может потенциально привести к плохим сообщениям об ошибках (см. Haskell).

Тем не менее причина C# для использования подобного синтаксису C происходила, вероятно, из-за маркетинга причин больше, чем что-либо еще: люди уже знакомы с языками как C, C++ и Java. Никакая потребность представить еще один синтаксис. Это имеет смысл для ряда причин, но он, очевидно, наследовал много слабых мест с этих языков.

4
ответ дан 27 November 2019 в 20:03
поделиться

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

C#, очевидно, имеет точки с запятой из-за своего наследия от C. Я перечитывал книгу K&R в последнее время, и довольно очевидно, что Dennis Ritchie действительно не хотел вынуждать программистов кодировать способ, которым он думал, было лучшим. Книга изобилует комментариями как, "Хотя мы не догматичны о вопросе, действительно кажется, что операторы перехода должны редко использоваться, если вообще" и в разделе по функциям они упоминают, что выбрали один из многих стилей форматирования, это не имеет значения, какой Вы выбираете, просто последовательны.

Таким образом, использование явного разделителя оператора позволяет программисту форматировать их код однако, им нравится. Что бы там ни было кажется согласовывающимся с тем, как C был первоначально разработан:сделай это по-своему.

1
ответ дан 27 November 2019 в 20:03
поделиться

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

a = b + c = d

могло быть снято неоднозначность между

a = b + c; = d

с ошибкой во втором операторе или

a = b + ; c = d

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

также помогает другому пути - если бы Вы означали писать

a = b; c = d;

, но typoed и не учел "c" тогда без полуфабрикатов, на которые это было бы похоже

a = b = d

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

3
ответ дан 27 November 2019 в 20:03
поделиться

Это может быть сделано. То, к чему Вы обращаетесь, называют "вставкой точки с запятой". JavaScript делает это с большим успехом, причина, почему это не применяется в C#, до ее разработчиков. Возможно, они не знали об этом или боялись, что это могло бы вызвать беспорядок среди программистов.

Для получения дополнительной информации во вставке точки с запятой в JavaScript, обратитесь к стандарту сценария ECMA 262, где JavaScript указан.

Я заключаю в кавычки из страницы 22 (в PDF, странице 34):

  • Когда, поскольку программа анализируется слева направо, с концом входного потока маркеров встречаются, и синтаксический анализатор не может проанализировать входной маркерный поток как единственную полную Программу Сценария ECMA, затем точка с запятой isa utomatically вставленный в конце входного потока.

  • Когда, поскольку программа анализируется слева направо, с маркером встречаются, который позволяется некоторым производством грамматики, но производство является ограниченным производством, и маркер был бы первым маркером для терминального или нетерминального сразу после аннотации “[никакой LineTerminator здесь]” с в ограниченном производстве (и там нос, такой маркер называют ограниченным маркером), и ограниченный маркер разделяется передняя сторона он предыдущий маркер по крайней мере одним LineTerminator, затем точка с запятой автоматически вставляется перед ограниченным маркером.

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

[...]

Документ спецификации даже содержит примеры!

1
ответ дан 27 November 2019 в 20:03
поделиться

Я сказал бы, что самой большой причиной, что точки с запятой необходимы после каждого оператора, является знакомство для программистов, уже знакомых с C, C++ и/или Java. C# наследовал много синтаксических вариантов от тех языков и просто не назван так же им. Завершенные точкой с запятой операторы являются только одним из многих вариантов синтаксиса, заимствованных из тех языков.

1
ответ дан 27 November 2019 в 20:03
поделиться

Вы могли точно утверждать, что требование, чтобы точка с запятой завершила оператор, является лишним. Технически возможно удалить точку с запятой из языка C# и все еще иметь его работа. Проблема состоит в том, что это оставляет комнату для неверного истолкования людьми. Я утверждал бы, что необходимость точек с запятой является разрешением неоднозначности ради людей, не компилятором. Без некоторой формы определения границ оператора людям намного более трудно интерпретировать краткий staements, такой как это:

int i = someFlag ? 12 : 5 int j = i + 3

Компилятор должен смочь обработать это очень хорошо, но человеку ниже взглядов намного лучше

int i = someFlag ? 12 : 5; int j = i + 3;
0
ответ дан 27 November 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: