KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Симон Робинсон - C# для профессионалов. Том II

Симон Робинсон - C# для профессионалов. Том II

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Симон Робинсон, "C# для профессионалов. Том II" бесплатно, без регистрации.
Перейти на страницу:

Синтаксис языка

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

□ C++ требует точку с запятой после определения класса. C# не требует.

□ C++ позволяет использовать выражения как инструкции, даже если они не имеют результата, например:

i + 1;

В C# это будет ошибкой.

Необходимо также отметить, что подобно C++, C# различает строчные и заглавные символы. Однако, так как C# создан для взаимодействия с VB.NET (который не отличает такие символы), строго рекомендуется не использовать имена, которые разнятся только регистром символов для каких-либо объектов, видных коду вне данного проекта (другими словами, имена открытых членов классов в коде библиотеки). Если используются открытые имена, которые отличаются только регистром символов, то это не позволит коду VB.NET получить доступ к этим классам. (В случае написания какого-либо управляемого кода C++ для среды .NET применимы те же рекомендации.)

Опережающие объявления

Опережающие объявления не поддерживаются и не требуются в C#, так как порядок, в котором элементы определены в файлах исходного кода, не имеет значения. Вполне допустимо одному элементу ссылаться на другой элемент, который позже определяется в этом файле или в другом файле, он должен только где-то быть определен. Это противоположно C++, в котором на символы и т.д. можно ссылаться в любом из файлов исходного кода, если они уже были объявлены в том же файле или во включаемом файле.

Отсутствие разделения определения и объявления

С отсутствием опережающих объявлений в C# связано то, что в C# не существует никакого разделения объявления и определения для любых элементов. Например, в C++ принято описывать класс в заголовочном файле сигнатурой функций членов, а полные определения даны в другом месте:

class CMyClass {

public:

 void MyMethod(); // определение этой функции находится в файле C++,

 // если только MyMethod() не является встраиваемой функцией

 // и т.д.

В C# этого не делают. Методы всегда определяются полностью в определении класса

class MyClass {

 public void MyMethod() {

  // здесь реализация

На первый взгляд может показаться, что это ведет к коду, который труднее читать. Достоинство подхода C++ в этом вопросе в конце концов состоит в том что можно просто просмотреть заголовочный файл, чтобы узнать, какие открытые функции предоставляет класс, не обращаясь к реализации этих функций. Однако это больше не требуется в C#, частично в связи с использованием современных редакторов (редактор Visual Studio.NET позволяет сворачивать реализации методов), а частично в связи с тем, что C# имеет средство автоматического создания документации для кода в формате XML.

Поток выполнения программы

Поток выполнения программы в C# аналогичен потоку C++. В частности, следующие инструкции работают точно таким же образом в C#, как они работают в C++, и имеют точно такой же синтаксис:

□ for

□ return

□ goto

□ break

□ continue

Существует пара синтаксических различий для инструкций if, while, do…while и switch, и C# предоставляет дополнительную инструкцию управления потоком выполнения foreach.

if…else

Инструкция if работает точно таким же образом и имеет такой же синтаксис в C#, как и в C++, кроме одного момента. Условие в каждом предложении if или else должно оцениваться как bool. Например, предположим что х является целым типом данных, а не bool, тогда следующий код C++ будет создавать ошибку компиляции в C#:

if (х) {

Правильный синтаксис C# выглядит так:

if (x != 0) {

так как оператор != возвращает bool.

Это требование является хорошей иллюстрацией того, как дополнительная безопасность типов в C# заранее перехватывает ошибки. Ошибки времени выполнения в C++, вызываемые написанием if (a=b), когда предполагалось написать if (a==b) являются достаточно распространенными. В C# эти ошибки будет перехватываться во время компиляции.

Отметим, что в C# невозможно преобразовать числовые переменные в или из bool.

while и do…while

Также, как и для if, эти инструкции имеют точно такой же синтаксис и назначение в C#, как и в C++, за исключением того, что условное выражение должно оцениваться как bool.

int X;

while (X) {/* инструкции */} // неправильно

while (X != 0) {/* инструкции */} // правильно

switch 

Инструкция switch служит для тех же целей в C#, что и в C++. Она является, однако, более мощной в C#, так как используется строка в качестве проверяемой переменной, что невозможно в C++:

string MyString; // инициализировать MyString

switch (MyString) {

case "Hello":

 // что-нибудь сделать

 break;

case "Goodbye":

 // и т.д.

Синтаксис в C# слегка отличается тем, что каждое предложение case должно явно заканчиваться. Не разрешается одному case содержать другой case, если только первый case не является пустым. Если желательно получить такой результат, используйте инструкцию goto.

switch (MyString) {

case "Hello":

 // что-нибудь сделать

 goto case "Goodbye"; // перейдет к выполнению инструкций

                      // в предложении "Goodbye"

case "Goodbye":

 // сделать что-то еще

 break;

case "Black": // здесь можно провалиться, так как он пустой

case "White":

 // сделать что-то еще

 // выполняется, если MyString содержит

 // либо "Black", либо "White"

 break;

default:

 int j = 3;

 break;

}

Компания Microsoft решила использовать инструкцию goto в этом контексте, чтобы предотвратить появление ошибок в случае, если требовалось выполнить пропущенный break, и код в инструкции switch проваливался в следующее предложение case.

foreach

C# предоставляет дополнительную инструкцию управления потоком выполнения foreach. foreach делает цикл по всем элементам массива или коллекции, не требуя явной спецификации индексов. Цикл foreach на массиве может выглядеть следующим образом. В этом примере предполагается, что MyArray является массивом double, и необходимо вывести каждое значение в консольном окне. Чтобы сделать это, используем следующий код:

foreach (double SomeElement in MyArray) {

 Console.WriteLine(SomeElement);

}

Отметим что в этом цикле SomeElement является именем, присвоенным переменной для итерации по циклу; здесь можно выбрать любое имя не конфликтующее с другими именами переменных.

Запишем также приведенный выше цикл следующим образом:

foreach (double SomeElement in MyArray)

 Console.WriteLine(SomeElement);

так как блочные инструкции в C# работают таким же образом, как составные инструкции в C++.

Этот цикл будет иметь точно такой же результат, как и следующий:

for (int I=0; I < MyArray.Length; I++) {

 Console.WriteLine(MyArray[i]);

}

(Отметим, что вторая версия иллюстрирует также, как получить число элементов в массиве в C#. Мы рассмотрим, как массив объявляется в C#, позже.)

Отметим, однако, что в отличие от доступа к элементам массива, цикл foreach предоставляет к своим элементам доступ только для чтения. Следовательно, следующий код не будет компилироваться.

foreach (double SomeElement in MyArray)

 SomeElement *= 2; // Неверно, для SomeElement нельзя выполнить

                   // присваивание

Мы упомянули, что цикл foreach может использоваться для массивов или коллекций. Коллекция не имеет аналога в C++, хотя концепция стала общераспространённой в Windows благодаря ее использованию в VB и COM. Коллекция по сути является классом, который реализует интерфейс IEnumerable. Так как это включает поддержку из базовых классов, понятие коллекция объясняется в главе 7.

Переменные

Определения переменных следуют в основном тем же образцам в C#, что и в C++:

int NCustomers, Result;

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*