Как указывалось ранее, доступные в C# типы данных отличаются от типов данных, доступных в Visual Basic, лишь деталями. Но не только это, все типы данных в C# имеют свойства, которые обычно связываются с объектами. Например, как мы видели, каждый тип данных, даже простые типы, такие как
int
и
float
, поддерживает вызов методов (кстати, это свойство не вызывает никакой потери производительности).
Хотя типы данных, доступные в C#, слегка отличаются от типов данных в VB, все же большинство типов данных, знакомые из VB, имеют непосредственные эквиваленты в C#. Например, вместо
Double
из VB, C# имеет
double
, вместо
Date
из VB , C# имеет базовый класс .NET
DateTime
, который реализует огромное число методов и свойств, позволяющих извлекать или задавать даты с помощью различных форматов.
Одним
исключением является
Variant
, для которого нет прямого эквивалента в C#. Тип данных
Variant
в VB является очень общим типом данных, который в некоторой степени существует только, чтобы поддерживать языки сценариев, которые не знают никаких других типов данных. Философия C#, однако, состоит в том, что язык является строго типизированным. Главная идея: если в каждом месте программы явно указывать используемый тип данных, то будет исключен один из основных источников ошибок времени выполнения. В связи с этим тип данных
Variant
в действительности не соответствует C#. Но все равно существуют ситуации, в которых необходимо ссылаться на переменную, не указывая тип этой переменной, и для этих случаев C# имеет тип данных
object
.
object
в C# очень похож на
Object
в VB. Однако в VB
Object
ссылается конкретно на объект COM и поэтому может использоваться только для ссылок на объекты, которые в терминологии VB означают ссылочные типы данных. Нельзя, например, использовать объектную ссылку для ссылки на
Integer
или на
Single
. В C#, напротив, объекты могут использоваться для ссылки на любой тип данных .NET, и так как в C# все типы данных являются типами данных .NET, это означает, что вы в праве преобразовать что угодно в
object
, включая
int
,
float
и все предопределенные типы данных. В этом смысле
object
в C# выполняет роль, аналогичную
Variant
в VB.
Типы данных значений и ссылочные типы данных
В Visual Basic существует четкое различие между типами данных значений и ссылочными типами данных. Типы данных значений включают большинство предопределенных типов данных:
Integer
,
Single
,
Double
и даже
Variant
(хотя строго говоря
Variant
может содержать также ссылку). Ссылочными типами данных являются любые объекты, включая определяемые модули классов и объекты ActiveX. Как можно было заметить из примеров в этом приложении, C# также делает различие между типами данных значений и ссылочными типами данных. Однако C# допускает больше гибкости, позволяя при определении класса найти, что этот класс будет типом данных значений. Это делается с помощью объявления класса структурой (struct). В той степени, насколько это касается C#, структура является по сути специальным типом класса, который представляется как значение, а не как ссылка. Накладные расходы, связанные с созданием экземпляров структур и их разрушением при завершении с ними работы меньше, чем связанные с созданием экземпляров и разрушением классов. Однако C# ограничивает свойства структур. В частности, нельзя выводить классы или другие структуры из структур. Причина этого состоит в том, что структуры предназначены для использования в качестве динамичных, простых объектов, для которых наследование в действительности не подходит. Фактически все предопределенные классы в C# —
int
,
long
,
float
,
double
являются на самом деле структурами .NET, вот почему на них можно вызывать такие методы, как
ToString
. Тип данных
string
является, однако, ссылочным типом и поэтому в действительности является классом.
Операторы
Необходимо сказать несколько слов об операторах в C#, так как они действуют несколько иным образом по сравнению с операторами VB, и это может внести путаницу, если программист привык работать с VB. В VB существует на самом деле два типа операторов:
□ Оператор присваивания
=
, который присваивает значения переменным.
□ Все другие операторы:
+
,
–
,
*
и
/
, каждый из которых возвращает какое-то значение.
Здесь существует важное различие в том, что ни один из операторов, кроме
=
, не имеет никакого эффекта в смысле изменения какого-либо значения. Со своей стороны,
=
присваивает значение, но ничего не возвращает. Не существует оператора, который делает и то и другое.
В C# такого разделения просто не существует. Правило в C# гласит, что все операторы возвращают значение,
а некоторые операторы имеют также дополнительный побочный эффект, присваивая некоторое значение переменной. Фактически мы уже видели пример этого, когда рассматривали оператор сложения-присваивания
+=
:
int А = 5, В = 15;
А += В; // выполняет арифметическую операцию
// и присваивает А результат (20)
Таким образом,
+=
возвращает, а также присваивает значение. Он возвращает новое значение, которое было присвоено. В связи с этим можно на самом деле написать:
int А = 5, B = 15;
int C = (А+=В);
Это в результате приведет в тому, что и
А
, и
С
будет присвоено значение 20. Оператор присваивания
=
также возвращает значение, которое было присвоено переменной с левой стороны выражения. Это означает, что можно записать код следующим образом:
С = (А = В);
Этот код задает
А
равным значению
В
, а затем то же самое значение присваивает
С
. Можно также написать эту инструкцию более просто:
С = А = В;
Обычное использование такого синтаксиса состоит в вычислении некоторого условия внутри инструкции
if
и одновременном задании результата этого условия в виде переменой типа
bool
(эквивалент в C# для
Boolean
из VB), чтобы можно было использовать это значение позже:
// предположим, что X и Y — переменные, которые были инициализированы.
bool В;
if (В = (X==Y)) DoSomething;
Этот код выглядит пугающим на первый взгляд, но он вполне логичен. Давайте разберем его. Прежде всего компьютер проверяет условие
X == Y
. В зависимости от того, содержат ли
X
и
Y
одинаковые данные, оно возвратит
true
или
false
и это значение будет присвоено переменной
В
. Однако поскольку оператор присваивания также возвращает значение, которое было только что присвоено все выражение
В = (X==Y)
также будет возвращать то же самое значение (
true
или
false
). Это возвращаемое значение затем используется предложением
if
для определения, нужно ли выполнять условную инструкцию
DoSometning
. В результате этого кода условие
X == Y
проверяется для выяснения, должны ли выполняться условные инструкции, и в то же самое время результаты этой проверки сохраняются в переменной
В
.
Тернарный оператор
В этом приложении нет места для обсуждения всех доступных в C# операторов. Они подробно рассмотрены в главах 3-6. Однако упомянем тернарный оператор (известный также как условный оператор), так как он имеет очень необычный синтаксис. Тернарный оператор формируется из двух символов —
?
и
:
. Он имеет три параметра и на самом деле эквивалентен инструкции
If
в VB. Синтаксически используется следующие образом:
// В, X и Y являются некоторыми переменными или выражениями.
// В является Boolean.
B ? X : Y
и работает так: оценивается первое выражение, которое расположено перед символом
?
, если оно оценивается как
true
, то возвращается результат второго выражение но если оно оценивается как
false
, то вместо этого возвращается результат третьего выражения. Это предоставляет предельно компактный синтаксис для условного задания значения переменной. Например, можно написать:
int Z = (Х==Y) ? 5 : 8;
что будет иметь такой же результат, как и следующие вычисления:
int Z;
if (X==Y) Z = 5;
else Z = 8;
Заключение
В этом приложении было представлено краткое введение в C# с точки зрения сравнения его с Visual Basic. Мы обнаружили довольно мало различий в синтаксисе. В целом синтаксис C# позволяет выразить большинство инструкций более компактным образом. Также можно заметить большое сходство между языками, например в их использовании классов (или модулей классов в VB), типов данных значений, ссылочных типов данных и многих синтаксических структур. Однако C# поддерживает также многие мощные свойства, в частности связанные с наследованием и классическим объектно-ориентированным программированием, которые недоступны в VB.