【问题标题】:What are the advantages of doing 100% managed development using C++/CLI?使用 C++/CLI 进行 100% 托管开发的优势是什么?
【发布时间】:2010-02-02 15:44:09
【问题描述】:

使用 C++/CLI 进行 100% 托管 开发有哪些优点(可能的缺点列表很长)(即使用“生成 ... 程序集,就像那些用... 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 的优势。

【问题讨论】:

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


【解决方案1】:

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

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

如果您想要一些您列出的 C++ 优势,例如预处理器、堆栈语义和模板,那么为什么不使用 C++?

【讨论】:

  • C++/CLI 对于除了互操作之外的任何东西都很糟糕。如果您想编写托管程序集,那么您使用 C# 的评论一针见血。
  • @Dan,我不相信仅凭这些就足以消除 C# 的开发便利性和更好的 IDE 支持
【解决方案2】:

奇怪,我喜欢 C++/CLI,但你列出的正是我不喜欢的特性。我的批评:

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

嗯,这可能都是非常主观的。丧钟将随 VS2010 一起提供,它将不提供对 C++/CLI 的 IntelliSense 支持。

【讨论】:

  • 您在哪里听说 VS2010 将放弃 IntelliSense for C++?在 Google 中快速搜索“VS2010 IntelliSense c++”后,除了 IntelliSense 的改进外,什么也没有。 -1 直到你能证明你的陈述。
  • @Russ - 不适用于 C++,不适用于 C++/CLI,正如我的帖子中明确指出的那样。链接:codeguru.com/forum/showthread.php?t=477959 把我的积分还给我,该死的!
  • 虽然我想我更喜欢最近的东西。 (connect.microsoft.com/VisualStudio/feedback/…)。我要买它。 +1 提供证据。
  • 啊,堆栈溢出说我的投票对我来说太旧了,除非编辑答案。 (+1 对您的评论有证据)
  • 在普通的 C++ 中,如果一个构造函数抛出,任何作为它的一部分被构造的对象都会运行它们的析构函数。 C++/CLI 会这样做吗?如果是这样,这似乎是优于 C# 的一个优势,它有时会使构造类层次结构变得非常困难,当构造函数抛出时不会泄漏。
【解决方案3】:

在 C++/CLI 中,您可以在类之外定义函数,而在 C# 中则不能。但我不知道这是否是一个优势

【讨论】:

    【解决方案4】:

    和这里的其他人一样,我想不出任何存在明显优势的一般情况,所以我的想法转向了情境优势——在特定情况下是否存在优势?

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

    让我详细说明...

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

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

    【讨论】:

      【解决方案5】:

      【讨论】:

        【解决方案6】:

        您可以在 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/

        【讨论】:

          【解决方案7】:

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

          1. 在 Windows 上快速上市
          2. 最终部署到非 Windows 平台
          3. 非 Windows 不得依赖 Mono

          在这种情况下,使用例如 C# 表示 1 会阻碍您在 2 和 3 上不重写。因此,可以在 C++/CLI 中开发,适当地使用宏和模板恶作剧,使其看起来尽可能像普通 C++,点击 reqt 1,然后点击 reqt 2,需要 (a) 重新实现所述宏和模板恶作剧映射到 pukka C++ 和 (b) 实现 pukka C++ 中使用的 .NET 框架类。请注意,(a) 和 (b) 可以在以后重复使用一次。

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

          我承认有点脆弱,所以我非常怀疑这是否曾经做过,但尝试一下会很有趣!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-12
            • 2023-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多