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:
- У вас уже есть большой проект на C++, и вы хотите использовать в нем.NET (хотите ли вы перенести его полностью в будущем или нет)
- Вы хотите использовать библиотеку, написанную на C или C++. Для простых библиотек вы можете использовать C#/PInvoke, но, например, если библиотека поставляется с системой сложного типа, вам может быть лучше создать обертки C++ / CLI вместо воссоздания системы типов в C#
- Части в вашем проекте лучше всего написаны на C++. Например, если вы выполняете распознавание речи или обработку изображений, C++ может просто лучше подходить для этой задачи.
Используя C++/CLI, гораздо проще взаимодействовать с собственным кодом C++
CLI/C++ имеет много преимуществ по сравнению с C#.
- STD библиотеки
- Нативный C++ / C не может быть просмотрен дизассемблером (например, Reflector), потому что они на самом деле не являются CLI (не нужно обфусцировать (хотя хороший хакер уже может с этим справиться)).
- Mingling C / C++ проектирует как оболочку для использования с языками.Net. C++/CLI не является языком, просто добавляет поддержку.Net с C / C++.
- Некоторый контроль над памятью через указатель 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