使用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的优势。
答案 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,但你确切地列出了我不喜欢的功能。我的批评:
嗯,这或许都是非常主观的。 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)
我同意你提到的内容,并作为预处理器使用的示例指向:Boost Preprocessor library for generating a set of types based on a list of basic types e.g. PointI32, PointF32 etc. in C++/CLI
答案 5 :(得分:1)
您可以将枚举和委托作为C ++ / CLI中的通用约束,但不能在C#中使用。
有一个库可以在C#中模拟这些约束。
答案 6 :(得分:0)
可以想象假设产品的以下要求:
在这种情况下,使用例如C#为1会使你在2和3时无法重写。因此,可以在C ++ / CLI中开发,适当地使用宏和模板恶作剧来看起来像普通的C ++一样,命中reqt 1,然后命中reqt 2,需要(a)重新实现所述的宏和模板恶作剧映射到pukka C ++和(b)实现pukka C ++中使用的.NET框架类。请注意,(a)和(b)将来可以重复使用一次。
最明显的反对意见是“为什么不在原生C ++中完成整个事情呢?”;好吧,也许你想要用来尽快进入市场的庞大的.NET类库中有很多好东西。
我承认,这一点有点脆弱,所以我非常怀疑这种做法是否已经完成,但试一试会很有趣!