Чи широко використовується мережа C ++?


25

Я кодер C ++ за традицією. Протягом останніх 12 місяців або близько того я робив багато кодування C # і був приємно здивований прагматичним підходом C # (одного разу я перестав намагатися кодувати це так, ніби це "C ++ зі збиранням сміття").

Нещодавно у нас були деякі випускники, і коли допомагав одному з них, я зрозумів, що вона використовує .Net в межах C ++. Запитавши її, чому, вона сказала, що їй "сказали використовувати C ++ її менеджер". Очевидна проблема з комунікацією, я припускаю, що вона використовувала. Чи не тому, що це єдина рамка, до якої вона піддається.

Потім я натрапив на старий проект старшого розробника, який також використовував C ++ для керування передньою формою Forms. Тепер це було б написано приблизно в той час, коли вперше з'явилася мережа, тому я припускаю, що з його боку це було навчальне заняття. Це був лише невеликий утилітний додаток.

Після цього довелося зробити незначну модифікацію в цьому додатку, мені здалося, що використання C ++ для управління. Net дає вам найгірше з обох світів. Ніякого збору сміття чи безпеки пам’яті, але немає подібних реальних можливостей швидкості та оптимізації, оскільки ви маєте справу з керованою базою.

Отже, моє питання полягає в тому, чи користуються люди C ++ .Net для великого окремого (тобто непровідної) виробничого коду, і якщо так, то які причини для цього? Я вільно визнаю, що ніколи не заглиблювався в розширення C ++ .Net, тому, можливо, я роблю це послугою.

Відповіді:


32

C ++. NET (або, точніше, C ++ / CLI) робить є збір сміття, так само , як і все інше , що працює на вершині .NET. Щоб досягти цього, залишаючись сумісним із власним C ++, він використовує ^синтаксис та gcnewдля зібраних сміттям ("безпечних") покажчиків.

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

Отже, не має особливого сенсу використовувати C ++ / CLI для проекту з нуля - все, що пов'язано .NET, що можна зробити з ним, можна також зробити в C #, з набагато приємнішим синтаксисом та додатковою безпекою не піддавати дії сирого покажчики за замовчуванням. Його найвидатніший резонанс - це перенесення існуючих баз коду до .NET. Компанія, яка вирішила почати використовувати .NET, але не бажає (або не в змозі через обмеження ресурсів та часу) переписати кожен програмний продукт, який вони створили до цього часу, може використовувати C ++ / CLI, щоб продовжувати використовувати існуючу кодову базу лише з мінімальними змінами, а потім перепишіть компоненти своєї системи в C # по черзі. Принаймні, це теорія; Я ніколи не бачив цього робити на практиці, тому не можу сказати, наскільки це добре працює.

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


10
Зверніть увагу, що "взаємодія з рідними бібліотеками" з P / Invoke обмежується dll зі статичними функціями, а COM - це клопот сам по собі. Обгортка в C ++ / CLR дозволяє отримати доступ до повнорозмірного рідного сервера / проекту в чистому коді C # з дуже невеликими обмеженнями. Я б не використовував його для розробки, але як клей, він набагато чистіший за P / Invoke, і він марширує.
Макс

По-друге - І я думаю, що Microsoft мовчки погодилися, судячи з того, як вони переозброїли C ++ на його належне місце у вітчизняному розвитку.
Джош Грейфер

2
Зауважте, що мова насправді називається C ++ / CLI, а не C ++. NET.
svick

@svick: Правильно. Відредаговано.
tdammers

1
@Max TBH Microsoft зробила все рідне. Тому зараз вам взагалі не потрібен C ++ / CLI, немає потреби писати ці неприємні обгортки для інтерфейсу C # з нативним кодом - просто переконайтеся, що вони об’єкти WinRT / COM, і ви закінчили.
gbjbaanb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.