Объявления
Очевидное синтаксическое различие между C# и VB в объявлении переменных состоит в том, что в C# тип данных предшествует, а не следует за именем переменной без использования других ключевых слов. Это дает объявлениям C# более компактный формат, чем их аналогам в VB.
Отметим, что идея объявления, состоящего только из типа, за которым следует имя, используется также и в других местах. Посмотрим снова на объявление метода в C#:
private void OnClickShowResults(object sender, System.EventArgs e);
Тип (void) предшествует имени метода, не используя никаких других ключевых слов для указания того, что объявляется — это очевидно из контекста. То же самое справедливо для параметров. Типами параметров являются object и System.EventArgs. Тип object в C#, кстати, играет роль, аналогичную Object в VB,— он указывает то, для чего тип данных не был определен. Однако object в C# значительно более мощный, чем Object в VB, и в C# object заменяет тип данных Variant из VB. object мы рассмотрим позднее. System.EventArgs не будет рассматриваться подробно в этом приложении. Это базовый класс .NET и он не имеет аналога в VB.
В случае переменных синтаксис объявления, использованный в C#, позволяет комбинировать объявление с заданием начального значения переменной. В этом примере NumberInput инициализируется достаточно сложным выражением, которое скоро будет рассмотрено подробнее. Но сначала два простых примера:
int x = 10; // int аналогично Long в VB
string Message = 'Hello World'; // string аналогично String в VB
Необходимо также отметить некоторые моменты, связанные с переменными.
VB позволяет присоединять суффиксы к переменным, чтобы указать их тип данных: $ для String, % для Int, & для Long.
Dim Message$ ' будет string
Такой синтаксис не поддерживается в C#. Имена переменных могут содержать только буквы, цифры и символ подчеркивания, и необходимо всегда явно указывать тип данных.
В примере кода VB переменной NumberInput по умолчанию будет присвоено значение 0 после ее объявления. Это на самом деле ненужная фата процессорного времени, так как этой переменной немедленно в следующей инструкции присваивается новое значение. C# немного больше знает о производительности и не беспокоится о задании каких-либо значений по умолчанию для локальных переменных при их объявлении. Вместо этого он требует, чтобы такие переменные всегда инициализировались в коде программы до их использования. Компилятор C# будет инициировать ошибку компиляции, если попытаться прочитать значение локальной переменной прежде, чем она будет задана.
Присваивание значений переменным
Присваивание значений переменным в C# делается с помощью такого же синтаксиса, как и в VB. После имени переменной помещается знак =, за которым следует присваиваемое значение. Однако необходимо отметить, что это единый синтаксис, принятый в C#. В некоторых случаях в VB используется Let, в то время как для объектов в VB всегда используется ключевое слово Set:
Set MyListBox = new ListBox;
C# не использует отдельный синтаксис для присваивания объектных ссылок. Эквивалент в C# для вышеприведенного будет следующим:
MyListBox = new ListBox();
Помните, что в C# значения переменным всегда присваиваются с помощью синтаксиса <ИмяПеременной>=<Выражение>.
Классы
Теперь рассмотрим, что происходит в выражении, используемом для инициализации переменной NumberInput в примере SquareRoot. В C# и VB делается практически одно и то же: извлекается текст из текстового поля txtNumber. Но синтаксис этого выглядит по- разному в двух этих языках:
NumberInput = CSng(Me.txtNumber.Text)
и
float NumberInput = float.Parse(this.txtNumber.Text);
Получение значения из текстового поля достаточно похоже в обоих случаях. Единственное различие для этой части процесса является чисто синтаксическим — VB использует ключевое слово Me, в то время как C# применяет ключевое слово this, которое имеет точно такое же значение (фактически, в C# можно его при желании опустить, так же как можно опустить Me в VB). В C# можно было в равной степени написать:
float NumberInput = float.Parse(txtNumber.Text);
Более интересной частью является то, как строка, извлеченная из текстового поля, преобразуется во float (или single), потому что это иллюстрирует фундаментальное свойство языка C#, о котором кратко упоминалось ранее:
В C# все является частью класса.
В VB для преобразования используется функция CSng. Однако C# не имеет функций в том виде, как в VB. C# является полностью объектно-ориентированным и разрешает объявлять только те методы, которые являются частью класса.
В C# преобразование из строки в число с плавающей точкой выполняется методом Parse() . Однако, так как Parse() является частью класса, ему должно предшествовать имя класса. Класс, на котором необходимо вызвать метод Parse(), будет классом float. До сих пор float интерпретировался просто как эквивалент C# для Single из VB. Но на самом деле он также является классом. В C# все типы данных тоже являются классами, и значит, такие вещи как int, float и string имеют методы и свойства, которые можно вызывать (хотя необходимо отметить, что int и float являются специальными типами класса, известного в C# как структуры. Различие для этого кода не важно, но оно будет объяснено позже.)
Если внимательно посмотреть на приведенный выше код, можно отметить незначительную проблему с аналогией, касающейся модулей класса VB. В методы вызываются определением имени переменной, а не
