C# C++/CLI:与C相比的优势#

C# C++/CLI:与C相比的优势#,c#,c++-cli,declaration,C#,C++ Cli,Declaration,托管C++/CLI与C#相比有什么主要优势吗。绝对不是我想的语法,因为C++/CLI中的以下代码非常难看 C++/CLI代码: [Out]List<SomeObject^>^% someVariable [Out]列表^%someVariable 将上述代码与C#代码进行比较: out List someVariable 只是出于好奇,C++中有一个更丑陋的语法,与上面的比较,< P>托管C++的优点是易于混合托管代码和非托管代码。但是如果所有代码(或几乎所有)都将被管理,那么

托管C++/CLI与C#相比有什么主要优势吗。绝对不是我想的语法,因为C++/CLI中的以下代码非常难看

C++/CLI代码:

[Out]List<SomeObject^>^% someVariable
[Out]列表^%someVariable
将上述代码与C#代码进行比较:

out List someVariable

只是出于好奇,C++中有一个更丑陋的语法,与上面的比较,

< P>托管C++的优点是易于混合托管代码和非托管代码。但是如果所有代码(或几乎所有)都将被管理,那么C肯定应该被使用(并且你仍然可以使用)。

与本地C++代码更容易的互操作是一个优点。 这是否是一个主要优势是主观的


< C++ > C++ C++语言,很容易与C语言相结合。

使用C++ +CLI,与本地C++代码< /p> 很容易交互。当你必须使用C++时,如果你能满足C的要求,那么为什么要去C++CLI

< P>我认为C++的主要优点是简单地熟悉C++开发人员。如果你不是来自C++背景,那么就与C语言进行合作。

< P>它几乎完全是一种可互操作的语言——既允许.NET代码访问传统的C++库,也可以用于扩展的现有(原生)C++代码库,访问.NET库(以及这些主题的一些变体)。 虽然可以在C++或CLI中完全编写成熟的应用程序,但它甚至可以提供一些纯C++中不可用的语言特性(例如垃圾收集),我怀疑有很多人会真正做到这一点。如果你已经离开了纯C++,没有与.NET交互的目标,可能会有更多的自然选择(例如,或者取决于你想进入哪个方向)。
同样,从纯C到C++的CLI可以带来C++模板的优点,但是这种需求很难得到你的步骤。

< P>我可以想到使用C++ +CLI的3个主要原因:

<>你已经有一个大的C++项目,想在.NET中使用.NET(你是否想在将来完全迁移它) 你想用C或C++编写的库。对于简单的库,您可以使用C#/PInvoke,但例如,如果库带有复杂的类型系统,您最好创建C++/CLI包装器,而不是在C中重新创建类型系统# <> LI>项目中的部分最好用C++编写。例如,如果你正在进行语音识别或图像处理,C++可能更适合于任务。

非托管C++应用程序不需要运行框架,C.*只在DOTNET框架1, 2, 3或4的机器上运行。令人惊讶的是,有多少机器仍然在没有这些框架的情况下运行。

作为一名主要的C#程序员,我发现自己不得不带着一点痛苦使用C++/CLI。然而,作为一种互操作语言,它远远超过了C语言,因为它必须使用本机代码。VisualStudio中的C++/CLI IDE缺少C风格的许多功能


总的来说,它有自己的位置,只要本机代码存在,它就仍然是可行的。如果不是必须的话,我不想从头开始使用C++/CLI IDE创建WinForm应用程序。

能够直接使用本机头文件是一个巨大的优势,但不是唯一的优势

堆栈语义比C#为
IDisposable
管理提供的任何功能都要好得多。C++/CLI有一个统一的语法,用于正确管理可IDisposable和不可IDisposable的变量(作为局部变量和成员字段)。比较:

ref class MyClass
{
   FileStream fs;
}
vs

现在哪种语言看起来很丑


还有模板、
interior#ptr
#define
、本机DLL导出、指向成员的指针,以及我可能忘记的其他一些东西。

CLI/C++比C++有许多优点

  • 标准图书馆
  • 反汇编程序(如Reflector)无法查看本机C++/C,因为它们实际上不是CLI(不需要混淆(尽管一个好的黑客已经可以做到这一点))
  • 混合C/C++项目作为包装器与.Net语言一起使用。C++/CLI不是一种语言,它只是添加了对.Net和C/C++的支持
  • 通过指向堆上C/C++对象的C/C++指针对内存进行一些控制

  • 我讨厌必须信任GC才能找到卡在gen 2上的对象。天知道它什么时候会从托管堆中释放。

    回答得好。但这并不是主观的——如果(并且只有当)你别无选择,只能处理现有的本地代码,这是一个主要的优势。这仍然是主观的。如果需要使用现有的DLL,可以选择使用C#和P/Invoke与现有代码进行互操作。对您来说,更容易进行互操作是“主要”优势还是“次要”优势,而拥有C#则是“主要”优势还是“次要”优势,完全取决于提出问题的人。我认为并非如此。我来自C++背景(与java和delphi混合),C语言很容易掌握。仅仅为了熟悉,不需要C++/CLI。我很幸运地摆脱了C++语法:有趣的是,我做过任何一段C++都有一段时间了,但是我认为C++和CLI语法比C语言更熟悉,但我想不是!你能详细说明关于语音识别或图像处理的3点吗?C++中的图像处理。在以前的项目中,我必须在C++的ASMX Web服务应用程序和IBM中间件之间编写一个接口,该中间件只有一个C++ API库(不是DLL,而是一个静态库)。C++/CLI是创建此桥的唯一选择。正在进行D.Net实现。也许在不久的将来,D可以与.Net进行互操作。我同意,除了#define。从我的观点来看,它在许多项目中的巨大而冷漠的使用是一个PITA。
    ref class MyClass
    {
       FileStream fs;
    }
    
    class MyClass : IDisposable
    {
      FileStream fs;
    
      void IDisposable.Dispose() { Dispose(true); }
      ~MyClass() { Dispose(false); }
    
      public virtual void Dispose(bool disposing) { if (disposing) fs.Dispose(); }
    }