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

9
托管C++/CLI相对于C#有哪些主要优势?我想肯定不是语法,因为以下C++/CLI代码真的很丑陋:
托管C++/CLI代码:
[Out]List<SomeObject^>^% someVariable

与C#代码比较:

out List<SomeObject> someVariable

仅出于好奇,C++/CLI中是否存在比上述更丑的语法。

11个回答

13

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

虽然在 C++/CLI 中完全可以编写成熟的应用程序,并且它甚至提供了一些在纯 C++ 中不可用的语言特性(例如垃圾收集),但我怀疑实际上会这样做的人并不多。如果您已经远离纯 C++,并且没有与 .Net 的互操作目标,那么可能会有更自然的选择(例如 DScala,根据您想要走的方向而定)。

同样地,从纯 C# 转向 C++/CLI 可能会带来 C++ 模板的优势,但这种需求很少导致您采取这一步骤。


1
我可以增加支持。在之前的项目中,我不得不编写一个接口,将C# asmx Web服务应用程序与只有C++ API库(而不是DLL而是静态库)的IBM中间件连接起来。 C++ / CLI是创建此桥梁的唯一选择。 - softveda
1
有一项D语言的.Net实现正在进行中。也许在不久的将来,D语言可以与.Net互操作。 - dsimcha

12

更容易与本地C++代码进行交互是其中的一个优点。

它是否是一个重大优势是主观的。

除非你想与现有的本地C++代码混合,否则你可能会更喜欢使用C#。


好的回答。但这并不是主观的 - 只有在你别无选择,不得不处理现有的本地代码时,它才是一个重要的优势。 - OregonGhost
3
这仍然是主观的。如果你需要使用现有的 DLL,你可以选择使用C#并使用P/Invoke与现有的代码进行互操作。无论易于互操作是否对你来说是“重要的优势”或“次要的优势”,还是使用C#是“重要的优势”或“次要的优势”,完全取决于提问者。 - user2048753

6

直接使用本地的头文件是一个巨大的优势,但这并不是唯一的优势。

堆栈语义比C#提供的任何内容都要好,用于IDisposable管理。C++/CLI有一个统一的语法来正确地管理既是IDisposable又是非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 导出、成员指针,以及可能还有其他我忘记的东西。


我同意,除了#define之外。在我看来,它在很多项目中被大量且不加区分地使用是一种极其恼人的事情。 - Alex

6
我可以想到使用C++/CLI的三个主要原因:
  1. 您已经有一个大型的C++项目,并希望在其中使用.NET(无论您是否希望在将来完全迁移它)
  2. 您想使用用C或C++编写的库。对于简单的库,您可以使用C#/PInvoke,但例如,如果该库具有复杂的类型系统,则最好创建C++/CLI包装器,而不是在C#中重新创建类型系统。
  3. 您的项目中的某些部分最好用C++编写。例如,如果您正在进行语音识别或图像处理,C++可能更适合此任务。

关于语音识别或图像处理,您能详细说明第三点吗? - Lopper
C++中的图像处理 => http://www.boost.org/doc/libs/1_41_0/libs/gil/doc/index.html - Oliver

3
使用C++/CLI可以更轻松地与本地的C++代码进行交互。

2
托管 C++ 的优势在于可以轻松混合托管和非托管代码。但是,如果您的所有(或几乎所有)代码都将是托管的,则应该使用 C#(并且仍然可以使用 DllImport 属性 从 C# 调用非托管代码)。

2

CLI/C++相比C#具有许多优势。

  1. STD库
  2. 本地C++/C代码无法被反编译器(如Reflector)查看,因为它们实际上不是CLI(虽然一个好的黑客已经可以通过这个)。
  3. 将C/C++项目作为包装器与.Net语言一起使用。 C++/CLI不是一种语言,只是增加了对C/C++在.Net中的支持。
  4. 通过指向堆上的C/C++对象的C/C++指针,在内存方面有一定的控制能力。

我不喜欢必须依靠GC来获取卡在第二代中的对象。只有上帝知道何时才能从托管堆中释放它。


1
作为一名主要使用C#的程序员,我发现自己不得不使用C++/CLI,这让我感到有些痛苦。然而,作为一种互操作语言,它远比C#更适合处理本地代码。Visual Studio中的C++/CLI IDE缺少很多C#版本的功能。
总的来说,它有其存在的价值,并且只要本地代码存在,它就会继续保持活力。如果没有必要,我不想使用C++/CLI IDE从头开始创建WinForm应用程序。

0

只有在必要的情况下才转向C++/CLI,如果您可以使用C#满足您的需求,为什么要费心去学习C++/CLI呢?


0
一般而言,我认为C++/CLI的主要优点是对于C++开发者来说非常熟悉。如果你不是从C++背景出发,那就选择C#吧。

我认为不是这样的。我来自C++背景(混合Java和Delphi),而且C#很容易掌握。没有必要只是为了熟悉性而使用C++/CLI。我很幸运能够摆脱C++语法 :) - OregonGhost
有趣的是,我已经很久没有写过 C++ 了,但我以为 C++/CLI 语法比 C# 更熟悉,但似乎不是这样! - Chris Fulstow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接