C ++ / CLI:优于C#的优势

托管C ++ / CLI与C#相比有什么主要优势吗? 绝对不是我想的语法,因为C ++ / CLI中的以下代码真的很难看,

C ++ / CLI代码:

[Out]List^% someVariable 

比较上面的C#代码:

 out List someVariable 

出于好奇,与上面相比,C ++ / CLI中的语法更加丑陋。

它几乎完全是一种互操作性语言 – 既允许.Net代码访问传统的C ++库,也可以访问.Net库的扩展现有(本机)C ++代码库(以及这些主题的一些变体)。

虽然可以仅在C ++ / CLI中编写完全成熟的应用程序,它甚至可以为您提供纯C ++中不具备的一些语言function(例如垃圾收集),但我怀疑有很多人会真正这样做。 如果你已经不再使用纯C ++,并且没有与.Net互操作的目标,那么可能有更多自然选择(例如D或Scala–取决于你想要进入哪个方向)。

同样,从纯C#转向C ++ / CLI可以说可以带来C ++模板的优势,但这种需求很少会导致你采取这一步骤。

与本机C ++代码更容易的互操作是一个优势。

它是否具有主要优势是主观的。

除非您想与现有的本机C ++代码混合使用,否则使用C#可能会好得多。

我可以想到使用C ++ / CLI的3个主要原因:

  1. 您已经拥有一个大型C ++项目,并希望在其中使用.NET(无论您是否希望将来完全迁移它)
  2. 您想要使用用C或C ++编写的库。 对于简单库,您可以使用C#/ PInvoke,但是如果libary附带复杂类型系统,您可能最好不要创建C ++ / CLI包装器而不是在C#中重新创建类型系统
  3. 项目中的部件最好用C ++编写。 例如,如果您正在进行语音识别或图像处理,C ++可能只是更适合该任务。

能够直接使用本机头文件是一个巨大的优势,但不是唯一的。

堆栈语义比C#为IDisposable管理提供的任何东西都要好得多。 C ++ / CLI有一个统一的语法,用于正确管理IDisposable变量和非变量变量,包括局部变量和成员字段。 比较:

 ref class MyClass { FileStream fs; } 

VS

 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导出,指向成员的指针,以及可能还有其他一些我忘记的事情。

使用C ++ / CLI,可以很容易地与本机C ++代码进行交互

托管C ++的优势在于可以轻松混合托管代码和非托管代码。 但是如果要管理所有(或几乎所有)代码,那么绝对应该使用C#(并且您仍然可以使用DllImport属性 从C#调用非托管代码 )。

CLI / C ++比C#有许多优点。

  1. 性病库
  2. 反汇编程序(如Reflector)无法查看本机C ++ / C,因为它们实际上不是CLI(不需要混淆(尽管一个好的黑客已经可以通过它获取))。
  3. Mingling C / C ++项目作为与.Net语言一起使用的包装器。 C ++ / CLI不是一种语言,只是增加了对.Net和C / C ++的支持。
  4. 通过指向堆上的C / C ++对象的C / C ++指针对内存进行一些控制。

我讨厌不得不相信GC才能找到一个停留在gen 2上的对象2. Lord知道什么时候会从托管堆中释放出来。

作为一名以C#为主的程序员,我发现自己不得不使用C ++ / CLI。 但是,作为一种互操作语言,它必须使用本机代码才能超过C#。 Visual Studio中的C ++ / CLI IDE缺少C#风格中的许多function。

总的来说,只要存在本机代码,它就有它的位置并且仍然可行。 如果我不需要,我不想用C ++ / CLI IDE从头开始创建WinForm应用程序。

你必须转向c ++ \ cli,如果你能用c#满足你的要求,为什么还要去c ++ \ cli

一般来说,我认为C ++ / CLI的主要优点是对C ++开发人员的熟悉程度。 如果您不是来自C ++背景,那么请使用C#。

非托管c ++应用程序不需要运行框架,c#只能在具有dotnet框架1,2,3或4的机器上运行。令人惊讶的是有多少机器在没有这些框架的情况下仍然运行。