Подтвердить что ты не робот

Перемещение с С# на С++ (плюс работа с обоими в одном решении)

Это очень общий вопрос. Я сам программист, программист на С#. Проект, над которым я хотел бы работать, был бы намного проще (в великой схеме вещей), если бы я знал С++. Насколько легко перемещаться с С# на С++? Любые подводные камни, за которыми я должен следить? И если я использую VS2010, могу ли я программировать (не в том же классе, но в том же проекте) что-то как на С#, так и на С++?

4b9b3361

Ответ 1

Перемещение с С# на С++ непросто. Основной синтаксис может выглядеть одинаково (например, если, для...), но существуют глубокие различия, например. переменные RAII и переменные стека-семантики, деструкторы которых вызывается, когда они выходят из области видимости и т.д., не присутствуют в С#.

Кроме того, С# использует не детерминированный сборщик мусора (который может быть в порядке для ресурсов памяти, но бесполезен для других ресурсов). Вместо этого, с современным С++, вы можете использовать шаблоны и интеллектуальные указатели (например, std::/boost:: * shared_ptr *), которые позволят вам иметь детерминированную ссылку на подсчет "сбор мусора", которая очень эффективна и действительна для как память, так и ресурсы без памяти (например, дескрипторы файлов, сокеты, текстуры...).

Кроме того, С# generics сильно отличаются от шаблонов С++ (шаблоны С++ очень мощные и позволяют продвинутый уровень программирования, называемый мета-программированием шаблонов).

В VS2010 вы можете иметь решение, предлагающее как проекты на С++, так и С#. Для связи между двумя мирами (родной мир С++ и управляемым миром .NET/С#) вы можете использовать С++/CLI как своего рода мост.

В Windows 8 должна быть введена новая технология под названием WinRT (на базе COM), которая позволяет межязычную связь. В этом случае вы можете использовать С++ с WRL (библиотекой на основе шаблонов) или расширениями языка С++/CX для создания компонентов на С++, которые могут использоваться с С# и .NET.

Счастливое обучение.

Ответ 2

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

Я рекомендую сначала захватить копию Скотта Мейера Эффективный С++ и прочитать его на обложке. Это лучший ресурс, который я знаю для правильного определения основ и, без сомнения, улучшил качество кода, который я производил, даже как "опытный" разработчик С++. Затем возьмите рамку unit test и посмотрите С++ kata (в данном случае проект xcode, но он все равно будет полезен). И познакомьтесь с стандартной библиотекой шаблонов, которая содержит много полезных/эффективных кодов/классов для контейнеров, алгоритмов и т.д.

Наконец, удачи. Изучение нового языка всегда является проблемой и может быть сложной задачей, но выигрыш в целом стоит того. Если ничего больше, вы увидите свой код С# с новыми глазами.

Ответ 3

Могу ли я программировать (не в том же классе, но в том же проекте) что-то в обоих С#     и С++?

Отвечать нет, вы не можете. Вы можете использовать Managed С++ и С++. Но если вы работаете с С#, то вы не можете иметь код С# и С++ внутри того же проекта

Насколько легко перемещаться с С# на С++?

Это немного субъективно, но, на мой взгляд, это будет очень трудный шаг. С++ - это другой язык, поэтому он будет так же усерден, как изучение нового языка:) снова он субъективен, поэтому я не буду вдаваться в подробности.

Ответ 4

Поскольку вы работаете с .NET, я предполагаю, что вы используете Visual Studio?

Совсем легко комбинировать С# и С++ в одной и той же программе, используя опцию /clr компилятора. Ваш код на С++ может включать как нормальные, стандартно совместимые классы С++, так и теги ref class.NET, предназначенные для использования с С#. Эти два являются отдельными, но могут обращаться друг к другу с помощью указателей от ref class до родного class и шаблона gcroot от native class до ref class.

Обратите внимание, что я сказал "в той же программе", а не "в том же проекте". Вам придется разделить на две части, один проект С# и один проект С++/CLI, а один будет DLL, который загрузит другой. Там также есть трюк для объединения двух вместе во время сборки, поэтому вы получаете один исполняемый файл, но это больше проблем, чем обычно.


Примечание. Вы можете найти этот класс интеллектуальных указателей, который я написал полезным, он значительно облегчает использование родных class объектов из ref class объектов .NET.