繁体   English   中英

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

[英]C++/CLI : Advantages over C#

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

C ++ / CLI代码:

[Out]List<SomeObject^>^% someVariable

比较上面的C#代码:

out List<SomeObject> someVariable

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

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

虽然可以写仅以C ++ / CLI完全成熟的应用程序,它甚至给你一些语言功能没有纯C ++中(如垃圾回收),我怀疑有多少人谁也真正做到这一点。 如果你已经远离纯粹的C ++并且没有与.Net互操作的目标,那么可能有更多自然的选择(例如DScala ,取决于你想要进入的方向)。

同样,从纯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不是一种语言,只是通过C / C ++添加了对.Net的支持。
  4. 通过指向堆上的C / C ++对象的C / C ++指针对内存进行一些控制。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM