имени модуля класса, но Parse
вызван с помощью определения имени класса float
, а не имени переменной. Parse()
в действительности является специальным типом метода, называемого статическим (static
) методом. Статический метод можно вызывать, не создавая экземпляр класса. Следовательно здесь определяется имя класса float
, а не имя переменной. static
имеет в C# значение, отличное от того, которое он имеет в VB. В C# нет эквивалента статическим переменным VB — в них нет необходимости в объектах C#, так как с этой целью будут использоваться поля C#.
Инструкции If
Мы переходим к основной части обработчика событий — инструкции if
. Вспомните, что версия VB выглядит следующим образом:
If (NumberInput < 0) Then
Me.txtSign.Texgt = 'Negative'
Me.txtResult.Text = CStr(Sqr(-NumberInput)) & ' i'
ElseIf (NumberInput = 0) Then
txtSign.Text = 'Zero'
txtResult.Text = '0'
Else
Me.txtSign.Text = 'Positive'
Me.txtResult.Text = CStr(Sqr(NumberInput))
EndIf
в то время как версия C# записывается так:
if (NumberInput < 0) {
this.txtSign.Text = 'Negative';
this.txtResult.Text = Math.Sqrt(-NumberInput).ToString() + ' i';
} else if (NumberInput == 0) {
txtSign.Text = 'Zero';
txtResult.Text = '0';
} else {
this.txtSign.Text = 'Positive';
this.txtResult.Text = Math.Sqrt(NumberInput).ToString();
}
Фактически наибольшее синтаксическое различие здесь уже было объяснено: каждая часть инструкции в C# должна быть одиночной инструкцией, следовательно, если необходимо условно выполнить более одной инструкции, надо объединить их в одну блочную инструкцию. В C#, если существует только одна инструкция для условного выполнения, не нужно формировать блочную инструкцию. Например, если пропустить задание текста в текстовом поле txtSign
в приведенном выше коде, то можно написать:
if (NumberInput < 0) this.txtResult.Text = Math.Sqrt(-NumberInput) + ' i';
else if (NumberInput == 0) txtSign.Text = 'Zero';
else this.txtResult.Text = Math.Sqrt(NumberInput).ToString();
Существуют и другие различия в синтаксисе, которые необходимо отметить. В C# скобки вокруг условия, которое проверяется в инструкции if
, является обязательным. В VB можно написать:
If NumberInput < 0 Then
Попытка выполнить то же самое в C# немедленно приведет к ошибке компиляции. В целом C# значительно более точен в отношении ожидаемого синтаксиса, чем VB. Отметим также, что при проверке равенства нулю NumberInput
для сравнения используются два последовательных знака равенства:
else if (NumberInput == 0)
В VB символ =
применяется в двух назначениях: для присваивания значений переменным и для сравнения значений. C# формально распознает это как операции двух различных типов и поэтому использует два различных символа: =
для присваивания и ==
для сравнения.
Существует еще одно важное различие, которое надо учитывать, так как оно может легко привести к ошибкам при переходе от VB к C#:
else if
состоит в C# из двух слов, а в VB используется одно слово ElseIf
Вычисление квадратного корня: еще один метод класса
В соответствии со сделанным ранее замечанием о том, что все в C# является членом класса, будет неудивительно узнать, что эквивалент в C# функции Sqr
из VB, которая вычисляет квадратный корень, также является методом, являющимся членом класса. В данном случае это метод Sqrt()
, который представляют статический член другого базового класса .NET с именем System.Math
, сокращаемый в коде просто до Math
.
Можно также заметить, что в этом примере в условии с введенным числом, точно равным нулю, ключевое слово this
в коде C# не определено:
txtSign.Text = 'Zero';
txtResult.Text = '0';
и в соответствующем коде VB также не определяется явно Me
. В C# по аналогии с VB, не требуется явно определять this
(Me
), если только по какой-то причине контекст окажется не ясным. Здесь это делается только для иллюстрации.
Строки
При выводе квадратного корня отрицательного числа выполняется небольшая работа со строками:
this.txtResult.Text = Math.Sqrt(-NumberInput).ToString() + ' i';
Этот код покалывает, что в C# конкатенация строк делается с помощью символа +
, а не &
. Можно также заметить, что преобразование из float
в String
выполняется с помощью вызова метода на объекте float
. Метод называется ToString()
, и он не является статическим, поэтому вызывается с помощью того же синтаксиса, что и в VB при вызове методов на объектах, способом задания перед именем метода имени переменной, представляющей объект, с точкой. В отношении C# необходимо помнить одну полезную вещь — каждый объект (и следовательно, каждая переменная) реализует метод ToString()
.