C ++. Net широко используется?

25

Я по традиции программист на C ++. За последние 12 месяцев я много занимался кодированием на C # и был приятно удивлен прагматичным подходом C # (однажды я перестал пытаться кодировать его так, как будто это «C ++ с сборкой мусора»).

Недавно у нас было несколько выпускников, и когда я помогал одному из них, я понял, что она использует .Net в C ++. После того, как она спросила, почему, она сказала, что "ее менеджер сказал ей использовать C ++". Помимо очевидной проблемы со связью, я предполагаю, что она использовала .Net, потому что это единственная структура, с которой она сталкивалась.

Затем я наткнулся на старый проект старшего разработчика, который также использовал C ++ для управления внешним интерфейсом Forms. Теперь это было бы написано примерно в то время, когда впервые появился .Net, поэтому я предполагаю, что с его стороны это было обучающее упражнение, чтобы поиграться с .Net. Это было всего лишь небольшое вспомогательное приложение.

Мне пришлось внести незначительные изменения в это приложение, и мне показалось, что использование C ++ для управления .Net дает вам худшее из обоих миров. Никакой сборки мусора или безопасности памяти, но также нет реальной скорости / возможностей оптимизации, так как вы имеете дело с управляемой средой.

Поэтому мой вопрос заключается в том, используют ли люди C ++ .Net для какого-либо большого отдельного (т.е. не подключенного) производственного кода, и если да, то каковы ваши причины для этого? Я свободно признаю, что никогда не углублялся в расширения C ++ .Net, так что я могу оказать ему плохую услугу.

GazTheDestroyer
источник

Ответы:

32

C ++. NET (или, точнее, C ++ / CLI) делает есть сбор мусора, так же , как и все остальное , который работает на вершине .NET. Чтобы достичь этого, оставаясь совместимым с собственно C ++, он использует ^синтаксис и gcnewуказатели для «мусора» («безопасные»).

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

Следовательно, не имеет особого смысла использовать C ++ / CLI для проекта с нуля - все, что связано с .NET, что может быть сделано с ним, также может быть сделано в C #, с гораздо более приятным синтаксисом и дополнительной безопасностью, не раскрывая raw указатели по умолчанию. Самым известным raison-d'etre является перенос существующих кодовых баз на .NET. Компания, решившая начать использовать .NET, но не желающая (или не способная из-за нехватки ресурсов и времени) переписать каждую часть программного обеспечения, которую они до сих пор производили, может использовать C ++ / CLI, чтобы продолжать использовать существующую кодовую базу с минимальными изменениями, а затем переписать компоненты своей системы в C # по одному. По крайней мере, это теория; Я никогда не видел, чтобы это было сделано на практике, поэтому я не могу сказать, насколько хорошо это работает.

Также обратите внимание, что сам C # может взаимодействовать с нативными библиотеками, поэтому, даже если вам приходится использовать существующие кодовые базы C ++, вам не обязательно перекомпилировать их с .NET: часто взаимодействие с ними через COM или P / Invoke является лучшим решением. ,

tdammers
источник
10
Обратите внимание, что «взаимодействие с нативными библиотеками» с P / Invoke ограничено dll со статическими функциями, а COM - это отдельная проблема. Оболочка в C ++ / CLR позволяет вам получить чистый доступ к полноразмерному внутреннему бэкэнду / проекту в вашем коде C # с очень небольшими ограничениями. Я бы не стал использовать его для разработки, но как клей, он НАМНОГО чище, чем P / Invoke, и это маршаллинг.
Макс
Seconded - И я думаю, что Microsoft молчаливо согласилась, судя по тому, как они перестроили C ++ на его законное место в нативной разработке.
Джош Грейфер
2
Обратите внимание, что язык на самом деле называется C ++ / CLI, а не C ++. NET.
свик
@svick: правильно. Ред.
tdammers
1
@Max TBH Microsoft сделала все родным. Так что теперь вам совсем не нужен C ++ / CLI, нет необходимости писать эти неприятные оболочки для интерфейса C # с нативным кодом - просто убедитесь, что они являются объектами WinRT / COM, и все готово.
gbjbaanb