一提到C語言,在偶這個始終的C語言菜鳥眼里,是個神奇的語言。經過了近半世紀的歷史,多少技術湮滅在信息時代的長河中,C語言卻依然在TIBOE排行榜中笑傲群雄。
本文是談.NET開發者看來,C語言有什么特點,我們能從C語言中了解些什么。個人覺得,C++過於復雜了,和.NET走的完全是兩條路,對我們沒有多大可借鑒啟發之處。
操作系統和硬件驅動主要都是C語言編寫的,比如Windows系統。C語言可以自由地通過嵌入系統頭文件,調用Windows函數,創建窗口,畫圖操作文件等等。而.NET要調用這些函數,必須像這樣聲明:
[DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int MessageBox(HandleRef hWnd, string text, string caption, int type);
user32.dll其實就是對應winuser.h,函數名和參數完全一樣。但C#必須先查好或記住這些名稱參數,所以顯然比C語言待遇低了一級。不過一般情況下,調用這些底層函數都被.NET Framework封裝了,比如命名空間System.Windows.Forms下的UnsafeNativeMethods類。
C語言聲名着著是其體積和速度,既因其高效,也由於其簡單。我們可以體會和現代編程語言原始風味的方案。
C語言為什么那么重視鏈表,而.NET的LinkList類從沒人用過,因為C語言從一個數一個字節地解決問題,而.NET立足於一個個對象。
沒有異常,就用不同的返回值表示處理結果。 那處理的數據怎么辦?用全局變量,或用參數傳址。
沒有越界檢查,保持邏輯正確,程序自助解決,可以利用這點寫更精巧用法,比如實現函數的可選參數。這更多地導致了無數緩沖區漏洞等安全問題,想得到高效又要安全,就只有在代碼上付出更多。
C語言類型系統十分簡單,就是按占字節數,1個是char,2個是short,4個是int。沒有枚舉和true/false。其實所有變量,所有類型,在C語言視角,都是一個字:數。
沒有泛型,反正類型都是數字,傳什么都行。
沒有委托/事件,有函數指針,至於簽名是否匹配,自助解決。
C語言也沒有一個各個平台通用的標准庫,提供標准的string和集合類型。C語言出現那時,都沒有Unicode這種概念。在Windows庫中,同義類型泛濫,光表示string的就有好多種,如WCHAR, PWCHAR, LPWCH, PWCH等等。
沒有繼承,C語言開發在有一些業務邏輯的系統就顯得笨拙。
C語言還有一些奇怪的脾氣,比如變量和函數聲明要放在最前面,函數不能返回指針或數組(因為只在函數棧上可用),久之就習以為常了。相比於現代編程語言,都是組織嚴密,無懈可擊,但覺得似乎千篇一律,少了一點個性。
我建議.NET開發者,如果只上過C語言大學課,無論何時重溫一下它的思想,會讓你的思維都會變更加全面。
C語言應用領域仍然海闊天空,應用比.NET要廣得多,但就不同的每個平台(Win/Unix/Mobile)而言,又要比.NET少得多,跨度要比Asp.NET到WPF開發大得多。所以至少從這方面講,做C開發不比.NET幸福,但做這種開發的,幾乎每個都是精英,一直為這些復雜的網站,管理系統, 各種App背后,默默地提供堅強支持。