建議6:分清readonly和const的使用方法.
首先區分他們的各自特點.
readonly:運行時常量.
const:編譯期常量(決定了它肯定是靜態的),只能修飾基元類型(string 也是屬於基元類型),和枚舉類型.
或許有人會問了,運行時常量和編譯期常量有什麼區別呢?那就先看一下代碼
//代碼片段 public static readonly int readonlyVar = 100; public const int constVar = 99; Console.WriteLine(readonlyVar.ToString()); Console.WriteLine(constVar.ToString());
編譯之後:
public const int constVar=0x63; public readonly int readonlyVar; Console.WrintLine(this.readonlyVar.ToString()); Console.WrintLine(this.0x63.ToString());
編譯後可以看到調用constVar的地方都是被”0x63”代替.而readonlyVar還是變量名.
運行時常量是在程序運行才被取值,運行時常量在產生IL時是產生該常量的引用.
編譯期常量是在編譯期就取值.
使用const的環境:系統中對於某個值是永恆不變的.比如.NET Framework 的Math.PI ( 3.14159) .(注意:如果修改它的值之後,引用它的項目都要重新編譯).
使用readonly的環境:對象需要一次賦值,其生命周期內不變的常量.
建議7:將0作為枚舉的默認值.
public enum Week { None=0, Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7 }此條建議為了Week在沒賦值的時候,取默認值就為”0”.這條處理方式更好,只是種較良的改善.
建議8:避免給枚舉類型的元素提供顯式的值
我個人不太贊同此條建議,我覺得為其顯式賦值,代碼看起來一目了然.
建議9:必須知道如何重載運算符.
比如Salary(薪水)類,如何讓兩個Salary相加?
public class Salary { public int RMB { get; set; } public static Salary operator +(Salary s1, Salary s2) { s2.RMB += s1.RMB; return s2; } }
這樣就可以這樣調用了:
Salary s1 = new Salary() { RMB = 100 }; Salary s2 = new Salary() { RMB = 200 }; Salary s3 = s1 + s2;
這是C#開發的基礎知識,或許它不常用,但是必須知道.
建議10:必須知道如何實現類比較器
所謂的比較器就只是一個接口,也只需要實現一個方法(public int CompareTo(object obj)).實現了比較器有什麼用呢?除了顧名思義的可以比較兩個實例的大小.還可以用來排序(比如是List集合,就直接調用.Sort()方法就可以了.方便至極.定義Salay class:
public class Salary : IComparable<Salary> { public int RMB { get; set; } public int CompareTo(Salary obj) { if (this.RMB > obj.RMB) { return 1; } else if (this.RMB == obj.RMB) { return 0; } else { return -1; } } }
調用:
List<Salary> salarys = new List<Salary>(); for (int i = 0; i < 5; i++) { Salary salary = new Salary() {RMB=100*i }; salarys.Add(salary); } salarys.Sort(); foreach (var item in salarys) { Console.WriteLine(item.RMB); }
排序就變成如此簡單.