C#易錯易混淆知識總結(二)
一,建構函式
我們先建立一個類,如下面的程式碼:
class Program { static void Main(string[] args) { } } //建立一個Person類 class Person { }
然後生成程式碼。
我們使用.NET Reflector反編譯該程式集。會發現該類一被編譯,CLR會自動的為該類建立一個預設的建構函式。如下圖:
所以在建立該物件的時候,會預設的為該類生成一個無引數的空方法體的建構函式。如果我們不顯式的寫明建構函式,CLR會為我們呼叫預設的建構函式。
class Person { //宣告有實現的建構函式 public Person() { Console.WriteLine("我是超人!"); } }
再次反編譯該程式集,會發現新增的建構函式覆蓋了C#編譯器預設為該類生成的建構函式,如下圖:
所以,當程式設計師手動添加了任意型別的建構函式,C#編譯器就不會為該類新增預設的建構函式。
建構函式的特點:
①訪問修飾符一般是Public②沒有返回值,方法名與類名稱一致;
二,This關鍵字的作用
①this關鍵字代表當前物件,當前執行在記憶體中的那一個物件。我們新增如下的程式碼:
private int nAge; public int NAge { get { return nAge; } set { nAge = value; } } //宣告有實現的建構函式 public Person() { this.NAge = 100; Console.WriteLine("我是超人!"); }
這時候我們反編譯該程式集,會看到如下結果:
可以看到this關鍵字代替的就是當前的Person物件。
②一個建構函式後面加“:”符號,後面跟this關鍵字,可以呼叫其它的建構函式
三,解析列舉
列舉的級別和類的級別一樣,可以自定義資料型別,可以在列舉名稱後使用“:”來指明列舉型別。看如下程式碼:
//定義一個方向的列舉型別,列舉成員使用","分割 enum Direction:string { east, west, south, north }
編譯會報錯,錯誤資訊如下:
由此我們可以知道列舉的資料型別是值型別。
每一個列舉成員都對應了一個整型的數值,這個數值預設從0開始遞增,可以通過強制轉換獲取該列舉所代表的值。
我們還可以手動為每一個列舉成員賦值,代表的是整型數值,賦值後該列舉成員所代表的值就是所賦的值。
四,空指標異常的問題
首先我們先宣告一個Dog類:
class Dog { private int nAge; public int NAge { get { return nAge; } set { nAge = value; } } private string strName; public string StrName { get { return strName; } set { strName = value; } } }
在Main()函式中我們這樣呼叫
Dog d = null; d.StrName = "旺旺";
結果會報錯,如下圖
我們已經為屬性,封裝欄位了,但是為什麼沒有辦法給欄位賦值呢?我們就來探究一下這個問題。
當我們例項化Dog物件,即
Dog d = new Dog();
.NET Framwork做了什麼工作呢?如下圖:
那為什麼會報錯呢,原因如下圖: