C#與C++區別-------轉載自博客園-Wei_java

一、C#與Java相似,編譯後獲得的還不是機器代碼,而是運行在虛擬機中的元指令。它對安全性作了更多的考慮,沒有指針,不能直接操做內存,自動實現內存管理。C++中的指針在帶來強大的靈活性和高效的同時,也帶了很多使用上的難題,C++程序中的絕大多數問題都來源於指針的不正確使用,C#出於軟件安全性的考慮和語言易用性的考慮沒有指針。 (c#無指針,)程序員

C#中實現自動垃圾回收,經過new在堆中建立對象,當對該對象的引用計數爲0時回收內存。類有構造函數而沒有析夠函數。 (c#無析構函數,會自動回收垃圾)c#

C#沒有指針這個概念,只有引用和數值之分。int等內部數據類型和struct定義的類型是數據類型,拷貝時作深度拷貝;而string和用class定義的類型是引用類型,拷貝時作淺拷貝——與深度拷貝對應,它經過引用計數來實現對象和內存管理。數組

C++中用指針可以輕易實現的功能,C#須要引進許多額外的機制。好比C++的函數指針,在C#中稱之爲delegate。C#中的參數傳遞,分爲傳值和傳址兩種,傳址時須要加ref或者out(傳回改變)關鍵字。安全

C#中的const與C++中的有所不一樣,它指編譯期常量,而運行期間的常量要用readonly來指定。 (delegate相似於函數指針,傳址時要加ref或out,const含義不一樣 c#中指編譯常量)函數

二、C#的OO特性更爲完全,一切皆對象,不存在獨立的函數,程序的入口Mai()函數是某個對象的public static成員函數。ui

全部對象都是由Object派生而來,包括內部數據類型int,float,string等,它們只是System.int32等的別名而已。C#中沒有模板,經過將參數設置爲Object類型來實現相似的功能,它的downcast相似於C++中的dynamic_cast操做符。設計

C#沒有頭文件,變量、函數和類沒有定義和申明的區別,都在一塊兒。只能經過設計抽象類的方式實現代碼分離。C++在這方面雖然作得還不夠完美,但比C#強很多。指針

C#中有屬性(Properties)和索引(Index)。屬性相似於C++中的那些GetValue()和SetValue()成員函數,只是使用上有些差異。索引相似於C++中的重載操做符[]。對象

C#中在類中的成員變量聲明處便可初始化,而C++中不行,二者均可以在構造函數中初始化成員變量。C#中的靜態成員變量能夠在靜態構造函數中初始化,而靜態構造函數是在該類的第一次使用時調用,而C++中是在編譯單元載入時初始化靜態成員變量。排序

三、C#的語法中多了foreach(typevinlist)statement;而C++中須要用C++標準庫的函數實現相似功能。

C++相對C而言,引入了許多便於實現OOP的特性,也有出於軟件工程方面考慮的特性。許多C++程序員(包括我)深感它的博大精神。同時,它又繼承了C語言的簡介和優美,儘可能用統一的風格實現儘量多的特性,好比操做符重載、模板等。C#與C++相比較,更加複雜,還顯得臃腫和凌亂。

附:

1. C#不支持多重繼承,這是與C++明顯區別的地方,說真的多重繼承有時候用起來挺麻煩的,可能微軟怕你用很差吧,不給你提供了,但我我的以爲沒有了多重繼承感受有點惋惜。2. 在標準的C#安全代碼中不支持指針類型的操做,然而,你卻能在微軟所謂的「非安全代碼」中操做指針類型對象。3. C#中全部對象都只能經過關鍵詞「new」來建立,C++的「類名_對象名」方式在C#中變爲聲明一個引用。呵呵,萬物皆對象,連常見的數據類型都變爲對象了,JAVA味道很濃。4. 數組變爲了類,所以對於數組裏的元素,.NETFramework直接提供了一系列的操做:查找、排序、倒置……5. 在C#裏面,數組的元素都是存放在託管堆裏面,比起C++的在內存裏不肯定位置申請一塊連續空間要安全得多。6. C++的switch後跟參數必須是int型,而C#卻容許string型,這點改進以爲真的是比之前方便多了!7. C#會禁止全部switch..case語句的失敗情形,除非case語句後是空格,不然執行了前一個case語句就算沒有break也會中止執行後面的case語句。8. 在異常處理上,C++容許拋出任何類型,而C#中規定拋出類型爲一個派生於System.Exception的對象。9. C++的宏在C#中被拋棄了不少,並且也不建議使用,所以不多見。10. C++的模板在C#裏沒有了,但在C#中咱們找到了能完成模板任務的更鋒利的武器:委託。11. C++的全局變量這一律念沒有了,C#和JAVA相似,要把全部東西都放在類裏面,還建議使用命名空間包含起來。12. C#能夠在定義類的時候直接給屬性賦值,而C++這麼作卻會編譯出錯。13. C#裏有靜態構造函數一個概念,這個構造函數只執行一次,所以可以保證一些靜態成員只被初始化一遍。14. C#有自動垃圾收集機制,防止內存泄露,把C++程序員從繁重的內存管理上解放出來。15. 更強的類型轉換保護機制,好比說把float轉成uint,直接轉換0.35會變成0.34,是由於二進制沒法表示這樣的數字,使用System.Conver裏的方法,能夠安全地把類型安全轉換過來。16. 委託與事件、裝箱與取消裝箱、Web Services……一大堆C++沒有的新東西,我感受是作大型項目方便了管理,也容易擴充,但作起小型項目,因爲是編譯成IL代碼的,運行須要.NET Framework SDK支持,效率是個問題,不利於作那些對運算速度和內存消耗要求高的項目。

相關文章
相關標籤/搜索