用于托管类型的 C++ 风格引用,比全面使用 非 null 引用 更为简洁,但比起无可奈何或者使用 解决方法 来说更好。
泛型不如模板强大
预处理器(这可能是一个缺点!但宏对于代码生成很有用)
引用类型的堆栈语义--自动调用 IDisposable::Dispose()
通过 C++ 析构函数更容易实现 Dispose()
C# 3.0 添加了自动实现属性,因此这不再是 C++/CLI 的优势。
用于托管类型的 C++ 风格引用,比全面使用 非 null 引用 更为简洁,但比起无可奈何或者使用 解决方法 来说更好。
泛型不如模板强大
预处理器(这可能是一个缺点!但宏对于代码生成很有用)
引用类型的堆栈语义--自动调用 IDisposable::Dispose()
通过 C++ 析构函数更容易实现 Dispose()
C# 3.0 添加了自动实现属性,因此这不再是 C++/CLI 的优势。
好吧,这可能都是非常主观的。死亡之钟将与VS2010一起到来,它将不支持C++/CLI的IntelliSense功能。
在C++/CLI中,您可以在类外定义函数,但在C#中无法这样做。但我不知道这是否是一个优势。
和其他人一样,我也无法想到任何普遍情况下存在明显优势的例子,因此我的想法转向了情境优势——是否存在特定情况下的优势呢?
优势:在快速原型设计场景中利用技术人员的C++技能。
让我详细说明一下...
我曾经与科学家和(非软件)工程师合作过,这些人没有接受过正式的编程培训。其中许多人使用C ++开发涉及高端物理/数学的特定模块。如果在快速原型设计场景中需要纯.NET模块,并且负责该模块的科学家/工程师的技能集是C ++,我会教他们少量额外的语法(public ref
,^
和%
以及gcnew
),并让他们将模块编程为100%托管的C++ / CLI DLL。
我认识到有许多可能的“但是...”回应,但我认为利用技术人员的C++技能是C++ / CLI的一个潜在优势。
我同意你所提到的,并且作为预处理器使用的示例,可以指向:Boost Preprocessor库,用于基于基本类型列表生成一组类型,例如在C++/CLI中的PointI32、PointF32等。
在C++/CLI中,您可以将枚举和委托作为泛型约束条件,但在C#中不行。
在C#中有一个库可以模拟这些约束。
对于一个假设的产品,可以想象出以下要求:
在这种情况下,如果使用C#来满足第1个要求,则在满足第2和第3个要求时需要进行重写。因此,可以使用C++/CLI进行开发,通过宏和模板技巧适当地混合,使其尽可能像普通的C++一样,以满足第1个要求,然后为了满足第2个要求,需要(a)重新实现所述宏和模板技巧以映射到真正的C++,以及(b)实现在真正的C++中使用的.NET框架类。请注意,(a)和(b)可以在完成一次后在未来重复使用。
最明显的反对意见是“为什么不完全使用本机C ++?”,好吧,也许有很多好东西在庞大的.NET类库中,您想使用它们来尽快进入市场。
我承认这有点牵强,所以我非常怀疑这曾经被做过,但尝试一下会很有趣!