2010-04-02 96 views
1

有人可以告诉为什么,创建C#语言,现在我们在C#4.0, 不要有一个重要特征是C++ \ CLI具有很大的微软!!,这是直接编译和链接与未托管的C++?非托管C++ .NET中

回答

3

C#是一种不同的语言。它不必包含任何其他语言的所有功能,以便对其用户社区有用。尤其是,C#4.0的重点一直是通过吸收动态(脚本)语言的特性来完全转向C++。同样,在C#与C/C++共享功能(例如指针)的地方,它们被隔离在一个特殊的“不安全”模式中,以表明它们通常是不受欢迎的。

此外,由于.NET是一个多语言平台,它是没有必要的每一种语言,包括为了他们的互操作所有其他语言的所有功能。无论如何,他们都可以轻松地打电话给对方。

注意,C++和C#从根本上相互不同意的关键字和运营商的意义。例如:(姑且不论这应该具有后与否分号(任选被一个逗号分隔的变量声明的列表之前),其将是棘手的统一)

class C { } 

C应该是一个本地C++类,可以使用非托管内存进行分配,并将其传递给其他本地代码,而不必将其固定在GC中?或者它应该是一个可以传递给其他.NET库的.NET类?

或者怎么样:

C c; 

应该就是声明引用到C,或创建C一个实例?

或者怎么样:

new C() 

应该就是在本地C++或堆在GC .NET堆上分配?

在C++/CLI中,所有这些问题都必须解决。从以前版本中发生的混乱中学习,Microsoft通过使用不同的关键字(如gcnew而不是new)清楚地分隔了C++/CLI中的两个世界。

如果您试图让C#像现在一样编译C++,那么您必须重命名许多已经是C#基础的操作,从而打破了与所有现有C#程序的兼容性。

会有什么意义?

+0

是.NET是多语言平台,但正如我们所看到的,所有的c#都在它们前面,所以我们期望它在c#中,甚至我们甚至在C#中使用VB的默认参数(从C++取得的)。 .. – Robocide 2010-04-02 07:14:03

+2

谁是“我们”?我自己说,因为.NET是一个多语言平台,我希望它能够支持多种语言并拥有自己的特色。 C#的利基不包括“成为C++的超集”。 – 2010-04-02 07:30:44

0

因为C#是托管语言,旨在用于编写托管代码和C++/CLI已经存在弥合谁需要直接联系非托管的C/C++代码的人的差距?

我不确定为什么你想要更多的本地链接支持超越DllImport/PInvoke。更重要的是,您只需重新创建C++/CLI,但语法不同。

+1

有人说,背后C#与VB.NET的故事,太;-) – Joey 2010-04-02 07:07:15

0

可以调用C++代码PInvoke就算了,是的,它是不一样的。

+0

是的,但是如: 我会那么需要实现其管理的版本它不是用C necessery所有匹配的结构++通过C++/CLI进行互操作。 – Robocide 2010-04-02 07:18:18

0

由于托管和非托管代码保持分开。在CLR中执行代码,而非托管代码不执行。您可以使用P/Invoke将托管代码与非托管代码链接起来。

Eseentially这是为了帮助你编组信息进出管理世界。

+0

是的,但例如: 然后,我需要实现其托管版本中的每个匹配结构,因为它不需要通过C++/CLI通过C++ Interop进行。 – Robocide 2010-04-02 07:19:53

+0

那么为什么不使用mC++呢? – 2010-04-02 07:37:45

0

您可以从托管代码调用非托管C++,并且可以从非托管C++调用托管代码。见PInvokeC++/CLI

+1

是的,但例如从c#调用本地​​C++:然后我需要实现其托管版本中的每个匹配结构,因为它不需要通过C++/CLI通过C++ Interop进行。 – Robocide 2010-04-02 17:24:42