C#是達成微軟公共語言運行庫(CLR)的少數語言中的一種。達成CLR的語言可以受益於其帶來的特性,如跨語言集成、異常處理、安全性增強、部件組合的簡易模型以及調試和分析服務。作為現代的CLR語言,C#是應用最為廣泛的,其應用場景針對Windows桌面、移動手機以及服務器環境等復雜、專業的開發項目。
C#是種面向對象的強類型語言。C#在編譯和運行時都有的強類型檢查,使在大多數典型的編程錯誤能夠被盡早地發現,而且位置定位相當精准。相比於那些不拘泥類型,在違規操作很久後才報出可追蹤到莫名其妙錯誤的語言,這可以為程序員節省很多時間。然而,許多程序員有意或無意地拋棄了這個檢測的有點,這導致本文中討論的一些問題。
本文描述了10個 C# 程序員常犯的錯誤,或應該避免的陷阱。
盡管本文討論的大多數錯誤是針對 C# 的,有些錯誤與其他以 CLR 為目標的語言,或者用到了Framework Class Library (FCL) 的語言也相關。
C++ 和其他很多語言的程序員,習慣了給變量賦值的時候,要麼賦單純的值,要麼是現有對象的引用。然而,在C# 中,是值還是引用,是由寫這個對象的程序員決定的,而不是實例化對象並賦值的程序員決定的。這往往會坑到 C# 的新手程序員。
如果你不知道你正在使用的對象是否是值類型或引用類型,你可能會遇到一些驚喜。例如:
Point point1 = new Point(20, 30); Point point2 = point1; point2.X = 50; Console.WriteLine(point1.X); // 20 (does this surprise you?) Console.WriteLine(point2.X); // 50 Pen pen1 = new Pen(Color.Black); Pen pen2 = pen1; pen2.Color = Color.Blue; Console.WriteLine(pen1.Color); // Blue (or does this surprise you?) Console.WriteLine(pen2.Color); // Blue
如你所見,盡管Point和Pen對象的創建方式相同,但是當一個新的X的坐標值被分配到point2時, point1的值保持不變 。而當一個新的color值被分配到pen2,pen1也隨之改變。因此,我們可以推斷point1和point2每個都包含自己的Point對象的副本,而pen1和pen2引用了同一個Pen對象 。如果沒有這個測試,我們怎麼能夠知道這個原理?
一種辦法是去看一下對象是如何定義的(在Visual Studio中,你可以把光標放在對象的名字上,並按下F12鍵)
public struct Point { … } // defines a “value” type public class Pen { … } // defines a “reference” type
如上所示,在C#中,struct關鍵字是用來定義一個值類型,而class關鍵字是用來定義引用類型的。 對於那些有C++編程背景人來說,如果被C++和C#之間某些類似的關鍵字搞混,可能會對以上這種行為感到很吃驚。
如果你想要依賴的行為會因值類型和引用類型而異,舉例來說,如果你想把一個對象作為參數傳給一個方法,並在這個方法中修改這個對象的狀態。你一定要確保你在處理正確的類型對象。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101596p2.htm