1. 程式人生 > 其它 >C#易錯易混淆知識總結(二)

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做了什麼工作呢?如下圖:

 

 那為什麼會報錯呢,原因如下圖: