Язык C# для разработчиков на языке С++
Обновлен: Ноябрь 2007
В следующей таблице содержится сравнение C# и C++ (где не используется /clr) в различных областях. Если вы являетесь разработчиком на языке C++, в этой таблице вы найдете важные различия между этими двумя языками.
Примечание. |
---|
Проекты C# и C++ основаны на разных моделях проектов. Дополнительные сведения о различиях между проектами C++ и C# см. в разделах Управление элементами в проектах и Использование обозревателя решений. |
Функция |
См. раздел |
---|---|
Наследование. В C++ классы и структуры практически идентичны друг другу, но в C# они достаточно сильно различаются. В классах C# может быть реализовано любое число интерфейсов, но наследоваться они могут только от одного базового класса. Кроме того, структуры в C# не поддерживают наследование и явные конструкторы по умолчанию (такой конструктор предоставляется по умолчанию). |
|
Массивы. В C++ массив — это просто указатель. В C# массивы — это объекты, включающие методы и свойства. Например, можно запросить размер любого массива с помощью свойства Length. В C# также используются индексаторы, проверяющие все индексы, используемые для доступа к массиву. Синтаксис объявления массивов в C# отличается от массивов в C++: маркеры "[]" в C# ставятся после типа массива, а не переменной. |
|
Логические типы. В C++ тип bool по сути представляет собой целое число. В C# не существует преобразования между типом bool и другими типами. |
|
Тип данных long. В C# тип данных long является 64-разрядным, а в C++ он 32-разрядный. |
|
Передача параметров. В C++ все переменные передаются значениями, кроме случаев, когда они передаются явным образом с указателем или ссылкой. В C# классы передаются ссылками, а структуры передаются значениями, кроме случаев, когда они явным образом передаются ссылками с модификаторами параметров ref или out. |
|
Оператор switch. В отличие от оператора switch в C++, в C# не поддерживается "проваливание" от одной подписи оператора case к другой. |
|
Делегаты. В C# делегаты приблизительно схожи с указателями функций в C++, являются строго типизированными и безопасными. |
|
Методы базового класса. В C# поддерживается ключевое слово base для вызова переопределенных членов базового класса из производных классов. Кроме того, в C# явным образом выполняется переопределение виртуальных и абстрактных методов с помощью ключевого слова override. |
Также см. примеры для override |
Скрытие методов. В C++ поддерживается неявное "скрытие" методов посредством наследования. В C# нужно использовать модификатор new, чтобы неявным образом скрыть унаследованные члены. |
|
Директивы препроцессора используются для условной компиляции. В C# файлы заголовков не используются. |
|
Обработка исключений. В C# предусмотрено ключевое слово finally для кода, который должен быть выполнен независимо от того, возникает ли при этом исключение. |
|
Операторы C#. В C# поддерживаются дополнительные операторы, такие как is и typeof. Также некоторые логические операторы действуют по-другому. |
|
Ключевое слово typedef. В C++ ключевое слово typedef применяется для создания более кратких и более удобных имен типов, которые уже были объявлены. В C# эта возможность обеспечивается директивой using. |
|
Ключевое слово extern. В C++ extern применяется для импорта типов. В C# extern применяется для создания псевдонимов для использования разных версий одной и той же сборки. |
|
Ключевое слово static. В C++ static можно использовать для объявления сущностей уровня классов и для объявления типов, относящихся к модулю. В C# static применяется только для объявления сущностей уровня классов. |
|
Метод Main в C# объявляется не так, как функция main в C++. В C# при объявлении имя метода пишется с заглавной буквы, и этот метод является static. Кроме того, в C# надежнее реализована предварительная обработка аргументов командной строки. |
Main() и аргументы командной строки (Руководство по программированию в C#) |
Указатели допускаются в C#, но только в режиме unsafe (в небезопасном режиме). |
|
В C# по-другому происходит перегрузка операторов. |
|
Строки. В C++ строка — это просто массив знаков. В C# строки — это объекты с поддержкой мощных методов поиска. |
|
Ключевое слово foreach позволяет выполнять итерацию массивов и коллекций. |
|
Глобальные элементы. В C# глобальные методы и переменные не поддерживаются. Методы и переменные должны содержаться в элементах class или struct. |
|
Директива препроцессора #define. В C++ директива #define обычно используется для объявления значений констант. В C# директиву #define нельзя использовать для этой цели. Для определения констант в C# следует использовать перечисляемые типы (только с целыми значениями) или статические элементы класса или структуры. При наличии нескольких констант имеет смысл создать для них отдельный класс "Constants". |
|
Импорт типов. В C++ типы, общие для нескольких модулей, помещаются в файлах заголовков. В C# для получения этих сведений служат метаданные. |
|
Локальные переменные в C# должны быть инициализированы перед использованием. |
|
Управление памятью. В C++ не выполняется сборка мусора. Память, которая не высвобождается явным образом, остается выделенной до завершения процесса. В C# выполняется сборка мусора. |
|
Деструкторы. В C# используется другой синтаксис для преднамеренного высвобождения неуправляемых ресурсов. |
|
Конструкторы. В C#, как и в C++, если не предоставить конструктор класса, будет автоматически создан конструктор по умолчанию. Конструктор по умолчанию инициализирует все поля их значениями по умолчанию. |
|
В C# не поддерживаются битовые поля. |
|
Службы ввода-вывода и форматирование в C# опираются на библиотеку времени выполнения платформы .NET Framework. |
|
В C# параметры методов не могут иметь значений по умолчанию. Для достижения того же результата следует использовать перегрузки методов. |
|
В C# универсальные методы и типы поддерживают параметризацию типов приблизительно так, как это реализовано в шаблонах C++. Тем не менее, есть значительные отличия: Например, в C# сведения об универсальном типе сохраняются во время выполнения. |
|
Ключевое слово as аналогично стандартному приведению, но вместо возникновения исключения при сбое преобразования будет возвращено значение null. Это аналогично использованию static_cast в C++, но в последнем случае, в отличие от dynamic_cast, проверка во время выполнения не осуществляется, и поэтому в случае сбоев не возникает исключений. |
Дополнительные сведения о сравнении ключевых слов в C# и в других языках программирования см. в разделе Языковые эквиваленты. Дополнительные сведения об общей структуре приложений C# см. в разделе Общая структура программы на C# (Руководство по программированию на C#).
См. также
Основные понятия
Руководство по программированию в C#