使用C ++ / CLI进行100%托管开发有什么好处?

时间:2010-02-02 15:44:09

标签: c# .net c++-cli

使用C ++ / CLI进行 100%托管开发有哪些优势(可能存在的缺点列表)(即使用/clr:safe进行编译“生成...程序集,就像那些写在... C#“)?特别是在使用C#时(注意C++/CLI : Advantages over C#Is there any advantage to using C++/CLI over either standard C++ or C#?主要是关于托管/非托管互操作)。

例如,这里有一些我的头脑:

  • C++-style references for managed types,并不像完整的non-nullable引用一样优雅,但优于无效或使用work-around

  • 比普通版本更强大的模板

  • 预处理器(这可能是一个缺点!,但宏可用于代码生成)

  • 引用类型的堆栈语义 - 自动调用 IDisposable :: Dispose()

  • 通过C ++析构函数轻松实现 Dispose()

C#3.0添加了自动实现的属性,因此不再是C ++ / CLI的优势。

7 个答案:

答案 0 :(得分:6)

我认为最大的优势是托管/非托管互操作。在不使用C#或其他.Net语言的情况下编写纯托管C ++ / CLI(至少对我而言)似乎完全忽略了这一点。是的,你可以做到这一点,但你为什么要这样做。

如果您要编写纯托管代码,为什么不使用C#。特别是(如nobugs所说)如果VS2010放弃了对C ++ / CLI的IntelliSense支持。同样在VS2008中,用于C ++ / CLI的IntelliSense不如C#IntelliSense好;所以从开发人员的角度来看,在C#中工作/探索/重构比在C ++ / CLI中更容易。

如果您希望列出一些C ++好处,如预处理器,堆栈语义和模板,那么为什么不使用C ++?

答案 1 :(得分:5)

奇怪,我喜欢C ++ / CLI,但你确切地列出了我不喜欢的功能。我的批评:

  • 好。但偶然使用帽子非常普遍,在没有警告的情况下获取值类型的值。没有办法诊断这个错误。
  • 高价的电源,您编写的模板不能用于任何其他.NET语言。如果有的话,它会恶化C ++模板导出问题。 STL / CLR的彻底失败也值得深思。
  • 呃,没有。
  • 这是IMO的一个严重错误。如第一个项目中所述,已经很难避免意外拳击的问题。堆栈语义使得任何初学程序员都很难对其进行排序。这是一个安抚C ++程序员的设计决定,没关系,但using语句是一个更好的解决方案。
  • 不确定如何更容易。 GC.SuppressFinalize()调用是自动的,就是这样。任何人编写终结器都很少非常,但你无法避免自动生成的代码进行调用。这是低效的,违反了“你不为你不使用的东西付费”的原则。除此之外,编写析构函数还会强制自动生成默认终结器。一个你永远不会使用的,如果你忘记或省略使用析构函数,就不想使用它。

嗯,这或许都是非常主观的。 VS2010将伴随死亡,它将在没有支持C ++ / CLI的IntelliSense的情况下发布。

答案 2 :(得分:3)

在C ++ / CLI中,您可以在类之外定义函数,但不能在C#中执行此操作。但我不知道这是否有利

答案 3 :(得分:2)

与其他人一样,我无法想到存在明显优势的任何一般情况,因此我的思维转向情境优势 - 在特定情况下是否存在优势?

优势:在快速原型设计方案中利用技术人员的C ++技能。

让我详细说明......

我与未经正式培训的程序员的科学家和(非软件)工程师合作过。其中许多人使用C ++开发涉及高端物理/数学的特定模块。如果在快速原型设计场景中需要纯.NET模块,并且负责该模块的科学家/工程师的技能集是C ++,我会教他们少量的附加语法(public ref,{{1} }和^%)并让他们将他们的模块编程为100%托管的C ++ / CLI DLL。

我认识到有一大堆可能的“是的,但是......”的回复,但我认为利用C ++技术人员的技能组合是C ++ / CLI的一个可能优势。

答案 4 :(得分:1)

答案 5 :(得分:1)

您可以将枚举和委托作为C ++ / CLI中的通用约束,但不能在C#中使用。

https://connect.microsoft.com/VisualStudio/feedback/details/386194/allow-enum-as-generic-constraint-in-c

有一个库可以在C#中模拟这些约束。

http://code.google.com/p/unconstrained-melody/

答案 6 :(得分:0)

可以想象假设产品的以下要求:

  1. Windows上的快速上市时间
  2. 最终部署到非Windows平台
  3. 不得依赖Mono进行非Windows
  4. 在这种情况下,使用例如C#为1会使你在2和3时无法重写。因此,可以在C ++ / CLI中开发,适当地使用宏和模板恶作剧来看起来像普通的C ++一样,命中reqt 1,然后命中reqt 2,需要(a)重新实现所述的宏和模板恶作剧映射到pukka C ++和(b)实现pukka C ++中使用的.NET框架类。请注意,(a)和(b)将来可以重复使用一次。

    最明显的反对意见是“为什么不在原生C ++中完成整个事情呢?”;好吧,也许你想要用来尽快进入市场的庞大的.NET类库中有很多好东西。

    我承认,这一点有点脆弱,所以我非常怀疑这种做法是否已经完成,但试一试会很有趣!