2010-04-02 117 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