歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C# 程序員最常犯的 10 個錯誤

關於C#

C#是達成微軟公共語言運行庫(CLR)的少數語言中的一種。達成CLR的語言可以受益於其帶來的特性,如跨語言集成、異常處理、安全性增強、部件組合的簡易模型以及調試和分析服務。作為現代的CLR語言,C#是應用最為廣泛的,其應用場景針對Windows桌面、移動手機以及服務器環境等復雜、專業的開發項目。

C#是種面向對象的強類型語言。C#在編譯和運行時都有的強類型檢查,使在大多數典型的編程錯誤能夠被盡早地發現,而且位置定位相當精准。相比於那些不拘泥類型,在違規操作很久後才報出可追蹤到莫名其妙錯誤的語言,這可以為程序員節省很多時間。然而,許多程序員有意或無意地拋棄了這個檢測的有點,這導致本文中討論的一些問題。

關於本文

本文描述了10個 C# 程序員常犯的錯誤,或應該避免的陷阱。

盡管本文討論的大多數錯誤是針對 C# 的,有些錯誤與其他以 CLR 為目標的語言,或者用到了Framework Class Library (FCL) 的語言也相關。

常見錯誤 #1: 把引用當做值來用,或者反過來

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

Copyright © Linux教程網 All Rights Reserved