Чтение онлайн

ЖАНРЫ

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

Ватсон Карли

Шрифт:

Необходимо также знать о паре других различных терминов:

Термин C++ Термин C#
Составной оператор Блочный оператор
lvalue Переменное выражение

В этом приложении будет по возможности использоваться терминология, соответствующая рассматриваемому языку.

Сравнение C# и C++

В этом разделе мы кратко рассмотрим общие различия и сходства между двумя языками.

Различия

Основные

области, в которых C# отливается от C++, представлены ниже:

□ Использование компиляции. Код C++ обычно компилируется в язык ассемблера. C#, наоборот, компилируется в промежуточный язык (IL, intermediate language), который имеет некоторые сходства с байт-кодом Java. IL потоп преобразуется в собственный исполнимый код процессом оперативной компиляции (JIT) Создаваемый код IL хранится в файле или множестве файлов, называемом сборкой. Сборка по сути формирует единицу, в которой упакован код IL. Эта единица соответствует DLL или исполнимому файлу, создаваемому компилятором C++.

□ Управление памятью. C# создан с целью освободить разработчика от проблем, связанных управлением памятью. Это означает, что в C# не требуется явно удалять память, которая была динамически выделена из кучи, как это требуется делать в C++. Вместо этого сборщик мусора периодически очищает память. Для облегчения процесса C# накладывает некоторые ограничения на то, как можно использовать переменные, которые хранятся в куче и более строгие ограничения имеет C++ в отношении безопасности типов данных.

□ Указатели. Указатели используются в 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# реализует альтернативный механизм, включающий интерфейс

IDisposable
.

□ Классы и структуры. C# формализует различия между классами (используемыми обычно для больших объектов с множеством методов) и структурами (используемыми обычно для небольших объектов, которые содержат чуть больше, чем обычные совокупности переменных). Классы и структуры хранятся неодинаково, структуры не поддерживают наследование, и есть другие различия.

Сходства

Области, где C# и C++ очень похожи

□ Синтаксис. Весь синтаксис C# очень похож на синтаксис C++, хотя существуют многочисленные небольшие различия.

□ Поток выполнения. C++ и C# имеют приблизительно схожие инструкции управления потоком выполнения. Они обычно работают одинаково в обоих языках.

□ Исключения. Поддержка для них в C# по сути такая же как в C++, за исключением того, что C# допускает блоки

finally
и накладывает некоторые ограничения на тип объекта, который может порождаться.

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

□ Конструкторы. Работают одинаковым образом в C# и C++, но опять же существуют некоторые различия в синтаксисе.

Новые свойства

C# вводит ряд новых концепций, которые не являются частью спецификации ANSI C++ (хотя большинство из них были введены компанией Microsoft как нестандартные расширения, поддерживаемые компилятором Microsoft C++). Они включают в себя следующие понятия:

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

Поделиться с друзьями: