C# для профессионалов. Том II
Шрифт:
□ Указатели. Указатели используются в C# также, как и в C++, но только в тех блоках кода, которые специально помечены для использования указателей. Большей частью C# полагается на ссылки в стиле VB/Java для экземпляров классов, и язык был создан с таким расчетом, чтобы указатели не требовались так часто, как в C++.
□ Перезагрузка операторов. C# не позволяет явно перезагружать так много операторов, как C++. Это по большей степени связано с тем, что компилятор C# в некоторой степени автоматизирует эту задачу, используя любые доступные специальные перезагружаемые версии элементарных операторов (таких
□ Библиотека. Как C++, так и C# зависят от наличия обширной библиотеки. Для ANSI C++ это — стандартная библиотека, для C# — множество классов, называемых базовыми классами .NET. Базовые классы .NET основываются на одиночном наследовании, а стандартная библиотека — на комбинации наследования и шаблонов. В то время как ANSI C++ держит библиотеку большей частью отдельно от самого языка, в C# такая взаимная зависимость значительно сильнее, и реализация многих ключевых слов C# прямо зависит от определенных базовых классов.
□ Среды использования. C# специально разрабатывался для основных потребностей программирования в рабочих средах на основе GUI (не обязательно только Windows, хотя язык пока доступен только для Windows), а также в таких базовых службах, как службы Web. Это на самом деле не повлияло на сам язык, но отразилось в дизайне библиотеки базовых классов C++, в противоположность такому подходу, создавался для более общего использования, в те времена доминировали интерфейсы пользователя на основе командной строки. Ни C++, ни стандартная библиотека не включают никакой поддержки элементов GUI. В Windows paзработчики C++ прямо или косвенно используют для этого API Windows.
□ Директивы препроцессора. C# имеет несколько директив препроцессора, которые следуют тому же общему синтаксису, что и C++. Но в целом существует значительно меньшее количество препроцессорных директив в C#, так как другие свойства языка C# снижают их значение.
□ Перечислители. Присутствуют в C#, но действуют более гибко, чем их эквивалентны в C++, так как являются синтаксически полноценными самостоятельными структурами, поддерживающими различные свойства и методы. Отметим, что их поддержка существует только в исходном коде, при компиляции в собственный исполнимый код перечислители по-прежнему реализуются как примитивные числовые типы, поэтому потери производительности нет.
□ Деструкторы. C# не может гарантировать, когда вызовется деструктор класса. В целом нет необходимости использовать парадигму программирования для создания кода деструкторов класса C#. Это возможно в C++, если только нет таких специальных внешних ресурсов, как соединения с файлом или базой данных, которые необходимо очистить. Так как сборщик мусора очищает всю динамически выделяемую память, деструкторы не играют такой важной роли в C#, как в C++. Для тех случаев, когда важно очистить внешние ресурсы как можно скорее, C# реализует альтернативный механизм, включающий интерфейс
□ Классы и структуры. C# формализует различия между классами (используемыми обычно для больших объектов с множеством методов) и структурами (используемыми обычно для небольших объектов, которые содержат чуть больше, чем обычные совокупности переменных). Классы и структуры хранятся неодинаково, структуры не поддерживают наследование, и есть другие различия.
Сходства
Области,
□ Синтаксис. Весь синтаксис C# очень похож на синтаксис C++, хотя существуют многочисленные небольшие различия.
□ Поток выполнения. C++ и C# имеют приблизительно схожие инструкции управления потоком выполнения. Они обычно работают одинаково в обоих языках.
□ Исключения. Поддержка для них в C# по сути такая же как в C++, за исключением того, что C# допускает блоки
□ Модель наследования. Классы наследуются одинаковым образом в C# и C++. Связанные концепции, такие как абстрактные классы и виртуальные функции, реализуются одинаковым образом, хотя и существуют некоторые различия в синтаксисе. C# поддерживает также только одиночное наследование классов. Сходство иерархии классов в связи с этим означает, что программы C# будут иметь общую архитектуру, очень похожую на соответствующие программы C++.
□ Конструкторы. Работают одинаковым образом в C# и C++, но опять же существуют некоторые различия в синтаксисе.
Новые свойства
C# вводит ряд новых концепций, которые не являются частью спецификации ANSI C++ (хотя большинство из них были введены компанией Microsoft как нестандартные расширения, поддерживаемые компилятором Microsoft C++). Они включают в себя следующие понятия:
□ Делегаты. C# не поддерживает указатели на функции. Однако аналогичный результат достигается помещением ссылок на методы в классах специальной формы, называемых делегатами. Делегаты могут передаваться между методами и использоваться для вызова методов, ссылки на которые они содержат, таким же образом, как указатели на функции могут использоваться в C++. В отношении делегатов важно отметить, что они содержат в себе объектные ссылки, также как и ссылки на методы. Это означает. что в отличие от указателей на функции, делегат содержит достаточно данных для вызова экземпляра метода в классе.
□ События. События аналогичны делегатам, но созданы специально для поддержки модели обратного вызова, в которой клиент уведомляет сервер о своем желании быть информированным, когда произойдет некоторое действие. C# использует события в качестве оболочек вокруг сообщений Windows таким же образом, как это делает VB.
□ Свойства. Эта идея, интенсивно используемая в VB и в COM, была импортирована в C#. Свойство является в классе методом или парой методов получения/задания, которые синтаксически оформлены так, что для внешнего мира они выглядят как поле. Они позволяют написать код в виде
□ Интерфейсы. Интерфейс может рассматриваться как абстрактный класс, назначение которого состоит в определении множества методов или свойств, которые классы могут согласиться реализовать. Идея ведет свое происхождение из COM. Интерфейсы C# не такие, как интерфейсы COM — они являются просто списками методов и т.д., в то время как интерфейсы COM имеют другие связанные свойства, такие как GUID, но принцип очень похож. Это означает, что C# формально распознает принцип наследования интерфейса, посредством которого класс наследует определения функций, но без каких-либо реализаций.