Симон Робинсон - C# для профессионалов. Том II
} else if (NumberInput == 0) {
txtSign.Text = "Zero";
txtResult.Text = "0";
} else {
this.txtSign.Text = "Positive";
this.txtResult.Text = Math.Sqrt(NumberInput).ToString();
}
}
Сравнивая эти два примера кода, можно увидеть сходство в структуре кода и даже без всякого знания C# получить представление о том, что происходит. Также понятно, что существует множество различий в синтаксисе двух языков. Далее будет проведено сравнение этих примеров, чтобы детально обсудить синтаксис C#. В ходе этого процесса мы также выявим различия между базовыми методологиями C# и VB.
Базовый синтаксис
Давайте рассмотрим две программы SquareRoot для ознакомления с синтаксисом C#.
С# требует, чтобы все переменные были объявлены
Начнем с первой строки кода VB, где находится объявление Option Explicit. Эта инструкция не имеет аналога в C#, так как в C# переменные должны всегда быть объявлены до своего использования. Это соответствует тому, как если бы C# всегда выполнялся с включенным Option Explicit и не разрешал отключить этот режим. Поэтому нет необходимости явно объявлять Option Explicit.
Причина такого ограничения заключается в том, что C# был очень тщательно спроектирован таким образом, чтобы затруднить случайное создание ошибок в коде. В VB рекомендуют всегда использовать Option Explicit, потому что это препятствует созданию трудно находимых ошибок, вызываемых неправильно записанными именами переменных. Легко заметить, что C# не позволяет делать вещи, которые с большой вероятностью могут привести к ошибкам.
Комментарии
Комментирование кода всегда важно, поэтому дальше в обоих примерах (или первое, что делается в примере на C#) добавляется комментарий:
// Обработчик событий нажатия пользователем кнопки Show Results.
// Выводится квадратный корень и знак числа
private void OnClickShowResults(object sender, System.EventArgs e) {
В VB для обозначения начала комментария используется апостроф, а комментарий продолжается до конца строки. Комментарии в C# в этом коде действуют таким же образом, за исключением того, что начинаются с двух прямых наклонных черт: //. Также как и для комментариев VB, можно использовать всю строку или добавить комментарий в конце строки:
// Этот код определяет результаты
int Result = 10 * Input; // получение результата
Однако C# более гибок в своих комментариях, так как позволяет использовать два других способа указания комментариев, каждый из которых имеет слегка различный эффект.
Комментарий также может быть ограничен последовательностями символов /* и */. Другими словами, если компилятор встречает последовательность /*, он предполагает, что весь последующий текст является комментарием, пока не встретит последовательность */. Это позволяет иметь длинные комментарии, которые распространяются на несколько строк:
/* этот текст действительно является длинным
длинным
длинным
длинным
комментарием * /
Короткие комментарии внутри строки являются очень полезными, если необходимо только временно заменить что-то в строке во время отладки:
X = /* 20 */ 15;
Третий способ похож на первый. Однако теперь используется три слэша:
/// <summary>
/// Event handler for user clicking Show Results button.
/// Displays square root and sign of number
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnClickShowResults(object sender, System.EventArgs e)
Если впереди используются три наклонные черты вместо двух, то комментарий по-прежнему продолжается до конца строки. Однако этот комментарий имеет теперь дополнительный результат: компилятор C# способен на самом деле использовать комментарии, которые начинаются с трех наклонных черт, чтобы автоматически создавать документацию для исходного кода как отдельный файл XML. Именно поэтому пример выше имеет достаточно формальную структуру для реального текста комментария. Эта структура готова к размещению в файле XML. Здесь не будут представлены детали этого процесса (он рассмотрен в главе 3). Необходимо только сказать, что комментируя каждый метод в коде, можно автоматически получить законченную документацию, которая обновляется при изменении кода. Компилятор будет даже проверять, что документация соответствует сигнатурам методов и т.д.
Разделение и группировка инструкций
Наиболее заметным различием между приведенными выше кодами на VB и на C# будет, почти наверняка, присутствие точек с запятыми и фигурных скобок в коде C#. Хотя это делает код C# довольно устрашающим, принцип на самом деле очень простой. Visual Basic применяет возврат каретки для указания конца инструкции, в то время как в C# используется для той же цели точка с запятой. Фактически компилятор полностью игнорирует все лишние пробелы, включая возвраты каретки. Эти свойства синтаксиса C# можно комбинировать, чтобы предоставить большую свободу при размещении кода. Например, следующий код (переформатированный из части приведенного выше примера) также вполне допустим в C#:
this.txtSign.Text = "Negative";
this.txtResult.Text = Math.Sqrt(-NumberInput) + " i";
Хотя очевидно, что если потребуется, чтобы другие люди смогли прочитать код, лучше предпочесть первый стиль кодирования. Visual Studio.NET будет в любом случае автоматически размещать код в таком стиле.
Скобки используются для группирования вместе инструкций в так называемые блочные инструкции (или иногда составные инструкции). Эта концепция в действительности не существует в VB. Можно сгруппировать вместе любые инструкции, помещая вокруг них скобки. Группа теперь рассматривается как одна блочная инструкция и может использоваться в любом месте в C#, где ожидается одиночная инструкция.
Блочные инструкции часто используются в C#. Например, в приведенном выше коде C# не существует явного указания на конец метода (C# имеет методы там, где VB имеет функции и подпрограммы). VB требуется инструкция End Sub в конце любой подпрограммы, так как подпрограмма может содержать сколько угодно инструкций. Специальный маркер является единственным способом, который известен в VB для определения конца подпрограммы. C# действует по-другому. В C# метод формируется в точности из одной составной инструкции. В связи с этим он заканчивается закрывающей фигурной скобкой, соответствующей открывающей скобке в начале метода.
Следующее действие часто встречается в C#: там, где Visual Basic использует некоторое ключевое слово для пометки конца блока кода, C# просто объединяет блок в составную инструкцию. Инструкция if в приведенных выше примерах иллюстрирует такой подход. В VB необходима инструкция EndIf для отметки окончания блока. В C# правило состоит в том, что предложение if всегда содержит точно одну инструкцию, и предложение else тоже одну. Если необходимо поместить более одной инструкции в любом предложении, как в случае примера выше, используется составная инструкция.
Использование заглавных букв
Еще одна особенность, которую можно заметить в отношении синтаксиса, состоит в том, что все ключевые слова— if, else, int и т.д. в коде C# пишутся со строчной буквы. В отличие от VB язык C# различает заглавные и строчные буквы. Если написать If вместо if, то компилятор не поймет этот код. Одним из преимуществ использования заглавных и строчных букв является возможность существования двух переменных, имена которых различаются только регистром символов, таких как Name и name. Такая ситуация встретится во втором примере этого приложения.
Идея имен переменных, различающихся только регистром символов, может показаться странной на первый взгляд. Но если к этому привыкнуть, можно обнаружить, что дополнительная свобода, которая благодаря этому достигается в именовании переменных, делает такую возможность действительно полезной.
Как правило, ключевые слова C# записываются полностью строчными буквами.
Методы
Давайте сравним синтаксис, применяющийся в VB и C# для объявления части кода, которая будет обрабатывать событие.
В VB:
Private Sub cmdShowResults_Click()
а в C#:
private void OnClickShowResults(object sender, System.EventArgs e)
Первое замечание, которое необходимо сделать, состоит в том, что версия VB объявляет подпрограмму, в то время как версия C# объявляет метод. В Visual Basic код традиционно группируется в подпрограммы и функции с лежащей в основе этого концепцией процедуры. Помимо этого, объекты классов VB имеют так называемые методы, которые для всех практических целей означают то же самое, что и процедуры, за исключением того, что они являются частью модуля класса.