C#新手常犯的錯誤匯總

來源:互聯網
上載者:User

標籤:異常   解析   http   必須   adl   server   12px   image   alt   

本文所述為C#新手常犯的錯誤,但是實際上很多有經驗的程式員也經常犯這些錯誤,對此特別整理了一下,供大家參考。具體如下:


1、遍曆List的錯誤

,比如如下代碼:

List<String> strList =newList<String>for(int i =0; i<strList.Count; i++){  strList.RemoveAt(i);}

這段代碼看上去是刪除了所有元素,實際上每次調用RemoveAt方法會導致List元素索引重排,最後導致元素沒有完全刪除。

可以改成:

List<String> strList =newList<String>for(int i =0; i<strList.Count; i++){  strList.RemoveAt(i);  i-=1;}

這樣就可以完全刪除List中的元素。


2、關於C#常量的錯誤

比如你寫了一個類庫,在裡面定義了如下常量:

public const String str="First Version";

並且在另一個程式裡引用了這個類庫,如果你修改了這個類庫中的常量,發布了一個新的版本,那麼再運行之前的程式,你會發現常量還是原來的常量,並沒有改變。這是因為C#在編譯的時候,常量直接作為中繼資料嵌入,解決方案是重新編譯整個解決方案或者使用屬性而不是直接存取常量。


3、當把實值型別裝箱後,如果拆箱只能拆成原來裝箱前的類型

,比如:

Int32 a=3;Object obj=new object();//這裡裝箱成功,不會失敗obj=i;//拆箱一定會失敗Int64 b=(Int64)obj;

可以像這樣操作:

Int64 b =(Int64)(Int32)obj;

就能完成轉型


4、重載==運算子的錯誤:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace UseOperator{  class Program  {    static void Main(string[] args)    {      Test t1 = new Test();      t1.MyFun();      Console.ReadLine();    }  }  class Test  {    public void MyFun()    {      Test t = new Test();      if (t == null)      {        Console.WriteLine("t為空白!");      }      else      {        Console.WriteLine("t不為空白!");      }    }    //存在BUG的重載運演算法    public static bool operator ==(Test t1, Test t2)    {      return t2.Equals(t1);    }    public static bool operator !=(Test t1, Test t2)    {      return !(t1 == t2);    }    //覆蓋HashCode    public override int GetHashCode()    {      return base.GetHashCode();    }    public override bool Equals(object obj)    {      return base.Equals(obj);    }  }}

這裡的問題在於MyFun中會把NULL傳遞進==運算子函數,導致啟動並執行時候報錯,正確的做法是:

public static bool operator ==(Test t1, Test t2){  if ((t2 as object) == null)  {    return (t1 as object) == null;  }  else  {    return t2.Equals(t1);  }}

5、C#中調用結構的屬性或者方法必須用new來聲明結構變數,否則會出錯。

6、如果使用了params使用多個參數,必須判斷參數是否為空白,否則程式會有隱藏的BUG。

7、靜態成員在建立第一個執行個體的時候就會初始化,而且只被初始化一次,不要亂用靜態成員。

8、如果使用ref Object型別參數接受String類型會出錯,這是因為C#要求參數必須使用正確的類型,不加ref是可以的,如果一定要使用ref Object接受String型別參數,可以先轉型成Object,再引用傳遞。

9、類的建構函式中永遠不要調用虛方法,比如:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace FransferVirtualFunction{  class Program  {    static void Main(string[] args)    {      try      {        Child ch = new Child();      }      catch (Exception ex)      {        Console.WriteLine(ex.Message);      }      Console.Read();    }  }  public class Ref  {    public string Str = "這是Ref類的一個成員";  }  public class Parent  {    protected Ref my;    public Parent()    {      my = new Ref();      //構造方法中調用了虛方法      Console.WriteLine(GetString());    }    //虛方法    public virtual string GetString()    {      return my.Str;    //使用了內部成員    }  }  public class Child : Parent  {    private Ref my2;    public Child()      : base()    {      my2 = new Ref();    }    //重寫虛方法    public override string GetString()    {      return my2.Str;    //使用了內部成員    }  }}

這裡在執行基類的建構函式的時候會執行到衍生類別的虛方法GetString(),在擷取my2.Str的時候拋出異常,因為此時衍生類別對象還沒有被構造。

10、在C#和SQL Server通訊時要注意NULL的含義,在SQL Server裡面這個值代表1900-1-1。SQL Server的空值可以使用DBNull來表示。

暫時就是這麼多了,注意到以上10點可以在編程的時候減少大量BUG。


補充:

1、Math 三角函數 其中的參數為 弧度值,而非角度值。

2、WinForm 中的由相對路徑引發的bug:具體可以參考

3、使用 xml, json 等序列化後的資料格式傳遞資料時,如果傳遞的資料為數值型類型,解析時,最好先將其轉為string 然後 tryParse 成相應類型。

至於原因:如上的第三點、是裝箱和拆箱的問題。

相信本文所述對大家C#程式設計可以帶來很大的協助。

除聲明外, 跑步客文章均為原創,轉載請以連結形式標明本文地址
  C#新手常犯的錯誤匯總

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23602.html






相關內容C#中把任意類型的泛型集合轉換成SQLXML資料格式的執行個體C#簡單訪問SQLite資料庫的方法(安裝,串連,查詢等)C#.Net ArrayList的使用方法WinForm實現自訂右下角提示效果的方法
C#顯示檔案夾下所有圖片檔案的方法c#實現抓取高清美女妹紙圖片WinForm中的幾個實用技巧匯總C#中類與結構的區別執行個體分析

C#新手常犯的錯誤匯總

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.