C#老手常犯的毛病匯總。本站提示廣大學習愛好者:(C#老手常犯的毛病匯總)文章只能為提供參考,不一定能成為您想要的結果。以下是C#老手常犯的毛病匯總正文
本文所述為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:詳細可以參考WinForm絕對途徑的圈套。
3、應用 xml, json 等序列化後的數據格局傳遞數據時,假如傳遞的數據為數值型類型,解析時,最好先將其轉為string 然後 tryParse 成響應類型。
至於緣由:如上的第三點、是裝箱和拆箱的成績。
信任本文所述對年夜家C#法式設計可以帶來很年夜的贊助。