前陣子看到這篇文章 10 Most Common C# Mistakes,裡頭有些是我面試時必問的題目,有些甚至在聚會場合,和寫了 2、3 年 C# 又自認蠻猛的人聊天後,才知道並非有經驗的人都了解這些基礎細節,其實知道這些語言常見錯誤不需要有很多年的經驗,即便完全沒有專案經驗,只要有好好的讀過一本好的語言書就夠了,知名的語言書一定都會提到。很可惜的是,現在不論是面試 Android 或 Windows Phone 的工程師,都很難遇到真的有好好讀完一本 Java 或 C#、C++ 書籍的人,大多數人都是從看前人寫的程式碼來學習一個程式語言,在這裡簡單的記錄幾項文中提到的基本易犯錯誤。
● Using a reference like a value or vice versa
在 C# 裡 Struct 是 value type 而 Class 是 reference type,分法就這麼簡單,但卻很多人以為 C# 可以和 Java 一樣用第一個字的大小寫來分,這完全是錯誤觀念,舉例來說,在 C# 中 double 只是 Double 的別名而已,可以在 double 關鍵字上按 F12 看看定義。文中的範例 Point 是一個結構,所以用 = 相連接兩個值,這是 Copy Value 的行為。
● Misunderstanding default values for uninitialized variables
Struct 是不需要 new 的,只有 Class 需要使用 new 來建構,所以即便文中只有寫 Point point1; 這樣子,即代表 point1 已經不是 null 了,而是佔有完整的結構空間,這也代表著要將一個 Object 轉型成 Struct 時,不能用 as 這個關鍵字來轉,要用 ( 結構名稱 ) 這種強轉型的方式來轉,因為結構成員不能接 null。
● Using improper or unspecified string comparison methods
當撰寫 typeof(String).IsClass 這個判斷時,得到的值會是 true,代表 String 是類別,比較類別是否相同需特別注意用 == 還是 Equal,一個是比較是否 "相同",一個是比較是否 "相等"。
● Using iterative (instead of declarative) statements to manipulate collections
LINQ 是 C# 裡面一個非常強大的語法,但很可惜許多人選擇撰寫 foreach 甚至效率更差的 for 加上宣告新的變數來存取結構而不是學習 LINQ。
● Neglecting to free resources
記得為你的 Class 實作 IDisposable 介面,並且搭配 using 語法使用,確保資源能夠有效的在最佳情況下回收,此外了解 Struct 與 Class 的 life cycle 也是很重要的,誤用 Struct 會讓你的記憶體不知不覺的被吃光,在手機上尤其明顯。
● Shying away from exceptions
使用 try cache 及回傳預設值的寫作方法選擇,對於取值與轉型,我偏好用 TryParse 這類方式,但有時利用 Exception 包住一段行為有助於降低複雜度,但記得別依賴 cache Exception 這種通用例外,它會讓你錯失找到潛在 Bug 的機會。
● Allowing compiler warnings to accumulate
編譯器的警告還是要控制在一定的數量下,基本上 C# 的 Warning 已經比起 Visual C++ 人性多了,沒有參考太多其他專案的情況下要求完全不能有 Warning 其實也不算太為難人。
沒有留言:
張貼留言