Язык C# для разработчиков на языке С++

Обновлен: Ноябрь 2007

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

yyaad03b.alert_note(ru-ru,VS.90).gifПримечание.

Проекты C# и C++ основаны на разных моделях проектов. Дополнительные сведения о различиях между проектами C++ и C# см. в разделах Управление элементами в проектах и Использование обозревателя решений.

Функция

См. раздел

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

class

interface

struct (справочник по C#)

Массивы. В C++ массив — это просто указатель. В C# массивы — это объекты, включающие методы и свойства. Например, можно запросить размер любого массива с помощью свойства Length. В C# также используются индексаторы, проверяющие все индексы, используемые для доступа к массиву. Синтаксис объявления массивов в C# отличается от массивов в C++: маркеры "[]" в C# ставятся после типа массива, а не переменной.

Массивы (Руководство по программированию на C#)

Индексаторы (руководство по программированию в C#)

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

bool

Тип данных long. В C# тип данных long является 64-разрядным, а в C++ он 32-разрядный.

long

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

структура

class

ref (Справочник по C#)

out (Справочник по C#)

Оператор switch. В отличие от оператора switch в C++, в C# не поддерживается "проваливание" от одной подписи оператора case к другой.

switch

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

делегат.

Методы базового класса. В C# поддерживается ключевое слово base для вызова переопределенных членов базового класса из производных классов. Кроме того, в C# явным образом выполняется переопределение виртуальных и абстрактных методов с помощью ключевого слова override.

base

Также см. примеры для override

Скрытие методов. В C++ поддерживается неявное "скрытие" методов посредством наследования. В C# нужно использовать модификатор new, чтобы неявным образом скрыть унаследованные члены.

new

Директивы препроцессора используются для условной компиляции. В C# файлы заголовков не используются.

Директивы препроцессора C#

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

try-finally

try-catch-finally

Операторы C#. В C# поддерживаются дополнительные операторы, такие как is и typeof. Также некоторые логические операторы действуют по-другому.

Оператор &

Оператор |

Оператор ^

is

typeof

Ключевое слово typedef. В C++ ключевое слово typedef применяется для создания более кратких и более удобных имен типов, которые уже были объявлены. В C# эта возможность обеспечивается директивой using.

Директива using (Справочник по C#)

Ключевое слово extern. В C++ extern применяется для импорта типов. В C# extern применяется для создания псевдонимов для использования разных версий одной и той же сборки.

extern

Ключевое слово static. В C++ static можно использовать для объявления сущностей уровня классов и для объявления типов, относящихся к модулю. В C# static применяется только для объявления сущностей уровня классов.

static

Метод Main в C# объявляется не так, как функция main в C++. В C# при объявлении имя метода пишется с заглавной буквы, и этот метод является static. Кроме того, в C# надежнее реализована предварительная обработка аргументов командной строки.

Main() и аргументы командной строки (Руководство по программированию в C#)

Указатели допускаются в C#, но только в режиме unsafe (в небезопасном режиме).

unsafe

В C# по-другому происходит перегрузка операторов.

Операторы языка C#

Строки. В C++ строка — это просто массив знаков. В C# строки — это объекты с поддержкой мощных методов поиска.

строка

String

Ключевое слово foreach позволяет выполнять итерацию массивов и коллекций.

foreach, in

Глобальные элементы. В C# глобальные методы и переменные не поддерживаются. Методы и переменные должны содержаться в элементах class или struct.

Общая структура программы C#

Директива препроцессора #define. В C++ директива #define обычно используется для объявления значений констант. В C# директиву #define нельзя использовать для этой цели. Для определения констант в C# следует использовать перечисляемые типы (только с целыми значениями) или статические элементы класса или структуры. При наличии нескольких констант имеет смысл создать для них отдельный класс "Constants".

static (Справочник по C#)

const (Справочник по C#)

Enum (Справочник по C#)

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

using

Общие сведения о метаданных

Локальные переменные в C# должны быть инициализированы перед использованием.

Методы (Руководство по программированию на C#)

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

Сборка мусора

Деструкторы. В C# используется другой синтаксис для преднамеренного высвобождения неуправляемых ресурсов.

деструкторы

Оператор using (Справочник по C#)

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

Конструкторы экземпляров

Таблица значений по умолчанию

В C# не поддерживаются битовые поля.

Битовые поля C++

Службы ввода-вывода и форматирование в C# опираются на библиотеку времени выполнения платформы .NET Framework.

Обзор языка C#

Таблица форматирования числовых результатов

В C# параметры методов не могут иметь значений по умолчанию. Для достижения того же результата следует использовать перегрузки методов.

Ошибка компилятора CS0241

В C# универсальные методы и типы поддерживают параметризацию типов приблизительно так, как это реализовано в шаблонах C++. Тем не менее, есть значительные отличия: Например, в C# сведения об универсальном типе сохраняются во время выполнения.

Универсальные шаблоны в C#

Ключевое слово as аналогично стандартному приведению, но вместо возникновения исключения при сбое преобразования будет возвращено значение null. Это аналогично использованию static_cast в C++, но в последнем случае, в отличие от dynamic_cast, проверка во время выполнения не осуществляется, и поэтому в случае сбоев не возникает исключений.

as (Справочник по C#)

Дополнительные сведения о сравнении ключевых слов в C# и в других языках программирования см. в разделе Языковые эквиваленты. Дополнительные сведения об общей структуре приложений C# см. в разделе Общая структура программы на C# (Руководство по программированию на C#).

См. также

Основные понятия

Руководство по программированию в C#

Управление элементами в проектах

Использование обозревателя решений