C++/CLI: преимущества перед C#

Есть ли существенное преимущество управляемого C++ / CLI над C#. Определенно не синтаксис, я полагаю, как следующий код в C++ / CLI очень уродливо,

Код C++ / CLI:

[Out]List<SomeObject^>^% someVariable

Сравните выше с кодом C#:

out List<SomeObject> someVariable

Просто из любопытства, есть ли еще более уродливый синтаксис в C++ / CLI по сравнению с вышеупомянутым.

11 ответов

Решение

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

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

Аналогичным образом, переход с чистого C# на C++ / CLI может принести преимущества шаблонов C++, но это редко приводит к тому, что вы делаете этот шаг.

Простое взаимодействие с собственным кодом C++ - это одно из преимуществ.

Является ли это главным преимуществом, субъективно.

Если вы не хотите смешиваться с существующим нативным кодом C++, вам, вероятно, намного лучше с C#.

Возможность напрямую использовать собственные файлы заголовков - огромное преимущество, но не единственное.

Семантика стека намного лучше, чем все, что может предложить C# для IDisposable управление. C++/CLI имеет единый синтаксис для правильного управления переменными, которые IDisposable и те, которые не являются как локальными переменными, так и полями-членами. Сравнение:

ref class MyClass
{
   FileStream fs;
}

против

class MyClass : IDisposable
{
  FileStream fs;

  void IDisposable.Dispose() { Dispose(true); }
  ~MyClass() { Dispose(false); }

  public virtual void Dispose(bool disposing) { if (disposing) fs.Dispose(); }
}

Теперь какой язык выглядит некрасиво?

Тогда есть шаблоны, interior_ptr, #defineсобственный экспорт DLL, указатель на член и, возможно, некоторые другие вещи, которые я забыл.

Я могу думать о 3 основных причинах использования C++/CLI:

  1. У вас уже есть большой проект на C++, и вы хотите использовать в нем.NET (хотите ли вы перенести его полностью в будущем или нет)
  2. Вы хотите использовать библиотеку, написанную на C или C++. Для простых библиотек вы можете использовать C#/PInvoke, но, например, если библиотека поставляется с системой сложного типа, вам может быть лучше создать обертки C++ / CLI вместо воссоздания системы типов в C#
  3. Части в вашем проекте лучше всего написаны на C++. Например, если вы выполняете распознавание речи или обработку изображений, C++ может просто лучше подходить для этой задачи.

Используя C++/CLI, гораздо проще взаимодействовать с собственным кодом C++

CLI/C++ имеет много преимуществ по сравнению с C#.

  1. STD библиотеки
  2. Нативный C++ / C не может быть просмотрен дизассемблером (например, Reflector), потому что они на самом деле не являются CLI (не нужно обфусцировать (хотя хороший хакер уже может с этим справиться)).
  3. Mingling C / C++ проектирует как оболочку для использования с языками.Net. C++/CLI не является языком, просто добавляет поддержку.Net с C / C++.
  4. Некоторый контроль над памятью через указатель C / C++, указывающий на объекты C / C++ в куче.

Я ненавижу доверять GC, чтобы добраться до объекта, застрявшего в гене 2. Господь знает, когда он будет выпущен из управляемой кучи.

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

Будучи преимущественно программистом на C#, я столкнулся с необходимостью использовать C++/CLI с небольшой болью. Однако, как язык взаимодействия, он FAR перевешивает C# для работы с нативным кодом. В C++/CLI IDE в Visual Studio отсутствует множество функций, связанных с C#.

В целом, оно имеет свое место и останется жизнеспособным, пока существует собственный код. Я бы не хотел создавать приложения WinForm с нуля с помощью C++/CLI IDE, если бы мне это не было нужно.

Неуправляемым приложениям на C++ не нужна среда для работы, C# будет работать только на машинах с платформой dotnet 1, 2, 3 или 4. удивительно, сколько машин все еще работает без этой платформы.

Вообще, я думаю, что основным преимуществом C++/CLI является просто знакомство с разработчиками C++. Если вы не из C++, тогда переходите на C#.

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

Другие вопросы по тегам