新手易犯的典型缺陷--C#

這段時間花了點時間整理了幾個新手易犯的典型缺陷(專門針對C#的),可是我的的力量畢竟有限缺陷的覆蓋面比較窄,有些缺陷的描述也不夠準確,這裏先貼出來看看能不能集思廣益,收集整理出更多的典型缺陷。目標就是但願剛入門.NET的新手看了以後能少走些彎路。數據庫

1 及時釋放資源

CLR託管環境扮演了垃圾回收的角色,因此你不須要顯式釋放已建立對象所佔用的內存。但這不意味着你能夠忽略全部的使用過的對象。許多對象封裝了其餘類型的系統資源(例如,磁盤文件,數據鏈接,網絡端口)。保持這些資源的使用狀態會急劇的耗盡系統的資源,削弱性能而且最終致使程序出錯。當你打開一個文件、網絡端口或者數據鏈接時,當你再也不使用這些資源時,應該儘快顯式釋放這些資源。
另外針對資源的操做,通常須要增長異常捕獲處理(Try..Catch),這時別忘記在finally中進行資源釋放,以確保在捕獲異常時也能夠正常釋放資源。網絡

2 正確中止多線程

FileStream fs = File.Open(…);
Try{…} Finally{ fs.Close;}

假設如上代碼在工做線程中,已經進行到finally裏面,這個時候UI線程調用了該線程的Abort()方法,則頗有可能fs.Close尚未執行的時候,工做線程跳出finally代碼塊了。這樣你的fs就永遠不會被Close了。
大多數狀況下,finally會永遠被被執行,但不包括調用Thread.Abort所引起的ThreadAbortException異常,鑑於此理由,不建議使用Abort。
要正確中止線程,不在於調用者採用了什麼行爲(不要直接使用Thread.Abort()),而更多依賴於工做線程是否能主動響應調用者的中止請求。
大致機制是,若是線程須要被中止,那麼線程自身就應該負責給調用者開放Cancel的接口。多線程

3 類型轉換相關

  • 若是從數據庫中讀取某個值,有數據時是int類型,沒有數據的話獲取到的是null,類型強轉則會異常。因此通常不多用強轉,用的話也必須作一個異常捕獲,避免程序異常。
  • 在強轉很差的狀況下,咱們建議使用TryParse方法,該方法已經對Parse方法進行了異常處理。
  • 也能夠用Convert,一樣須要進行異常捕獲;其實,凡是涉及到類型轉換,序列化等操做的地方,都須要捕獲異常;

4 字符串操做問題

在對字符串操做中,若涉及大量拼接操做建議使用StringBuilder。若使用String會帶來明顯的性能損耗。緣由在於string對象是個很特殊的對象,它一旦被賦值就不可改變。在運行時調用String類中任何拼接操做(如賦值、」+」等),都會在內存中建立一個新的字符串對象,也意味着要爲該新對象分配新的內存空間。性能

5 const常量修改致使的問題

當程序引用其餘dll中的const常量時要特別引發注意。
若修改了此dll中的const常量後,要從新編譯引用了此dll中這個const常量的全部程序,不然程序中使用的這個常量值將和dl中的不一致。
另外若是使用readonly代替const能夠解決這個問題,不須要從新編譯,由於const是編譯型常量,而readonly是運行時常量。ui

6 C#編譯目標平臺問題

當程序依賴的dll的編譯的目標平臺是X86,則程序自己的編譯目標平臺也必須是X86(而不是默認選項Any CPU),不然64位電腦將沒法運行。線程

7 跨線程訪問控件

在開發界面程序時,會遇到比較耗時的操做,爲了程序的友好性,咱們通常會在任務線程中執行耗時操做,並將執行信息顯示在主UI線程。
假如直接在任務線程中操做主UI線程中的控件,這樣極易出現異常,報「不能在其餘線程中修改建立控件線程的值」,若是設置了禁止編譯器對跨線程訪問作檢查,就不會報錯,可是會出現沒法預知的問題。此時建議採用委託或匿名委託的方式實現。code

8 從新拋出異常的正確方式

try
{
    //do something
}
catch(Exception ex)
{
    throw;
}

正確的寫法是throw,不要用throw ex,不然會清空stacktrace,沒法定位到真正異常代碼的位置。對象

相關文章
相關標籤/搜索