C# для профессионалов. Том II
Шрифт:
this
Оператор
В C# это будет выглядеть так:
new
Как сообщалось ранее, оператор
Классы и структуры
В C++ классы и структуры очень похожи. Формально единственное различие состоит в том, что члены структуры являются по умолчанию открытыми, в то время как члены класса являются по умолчанию закрытыми. На практике, однако, многие программисты предпочитают использовать структуры и классы различным образом, сохраняя использование структур для объектов данных, которые содержат только члены-переменные (другими словами, без функций членов или явных конструкторов).
C# отражает это традиционное различие использования. В C# класс — это совершенно другой тип объектов, по сравнению со структурой, поэтому нет необходимости тщательно рассматривать, будет ли лучше определить заданный объект как класс или как структуру. Наиболее важные различия между классами C# и структурами C# следующие:
□ Структуры не поддерживают наследование, кроме того факта, что они являются производными из
□ Структуры являются типами данных значений. Классы всегда являются ссылочными типами данных.
□ Структуры позволяют организовать способ размещения полей в памяти и определяют эквивалент объединений C++.
□ Конструктор структуры по умолчанию (без параметров; всегда поставляется компилятором и не может быть заменен.
Поскольку классы и структуры сильно отличаются в C#, они в этом приложении рассматриваются по отдельности.
Классы
Классы в C# следуют в основном тем же самым принципам, что и в C++, однако существует разница в свойствах и синтаксисе. Мы рассмотрим отличия между классами C++ и классами C# в этом разделе.
Определение класса
Классы определяются в C# с помощью синтаксиса, который на первый взгляд выглядит как синтаксис C++:
За этим первоначальным сходством скрываются многочисленные различия в деталях.
□ Не существует модификатора доступа по имени базового класса. Наследование всегда открытое.
□ Класс может быть выведен только из одного базового класса (хотя из любого числа интерфейсов). Если базовый класс явно не определен, то класс будет автоматически выводиться из
□ Каждый член явно объявляется с модификатором доступа. Не существует эквивалента синтаксису C++, где один модификатор доступа может применяться к нескольким членам.
□ Методы не могут объявляться как
□ Реализация методов всегда помещается вместе с определением. Невозможно написать реализацию вне класса, как позволяет C++.
□ В то время как в ANSI C++ единственными типами члена класса являются переменные, функции, конструкторы, деструкторы и перезагружаемые версии операторов, C# имеет в наличии также делегатов, события и свойства.
□ Модификаторы доступа
□
□
□ Инициализация переменных разрешается в C# в определении класса.
□ В C++ ставится точка с запятой после закрывающейся фигурной скобки в конце определения класса. Это не требуется в C#.
Инициализация полей членов
Синтаксис, используемый для инициализации полей членов в C#, очень отличается от синтаксиса C++, хотя конечный результат одинаковый.
В C++ поля членов экземпляра обычно инициализируются в списке инициализации конструктора:
В C# этот синтаксис недопустим. Можно помещать в инициализатор конструктора (который является эквивалентом C# списка инициализации конструктора в C++) другой конструктор. Вместо этого инициализированное значение помечается с помощью определения члена в определении класса:
Отметим, что в C++ это будет ошибкой, так как C++ использует примерно такой же синтаксис для определения чисто виртуальных функций. В C# такое действие считается нормой, так как C# не применяет синтаксис
В C++ статические поля инициализируются с помощью отдельного определения вне класса: