天天看點

淺談readonly和const

   這是個非常簡單但是又為很多人不知曉的東西,說出來很俗,但不說不一定絕大多數的programer能夠clear。

    下面就對這兩個進行下差別說明:    

   readonly:

    ①readonly叫做隻讀,它辨別字段隻能被讀操作。

    自然可以被讀,那麼必然有個地方給它指派。

    ②readonly的指派隻能在構造器重完成,構造器包括類型構造器和執行個體構造器,響應的字段也要用static和不使用static來修飾。

    ③readonly可以被static關鍵字修飾,變成靜态隻讀字段。

   const:

   ①const叫做常量,所謂的常量就是說一旦初始定義以後再也不能被修改。

   ②const邏輯上是靜态的,是以不能和static連用。

    比較抽象的話就看這個demo:

   class readonlyandconst

   {

       //常量字段

       private const string testfield = "這隻是一個用于測試常量的字段!";

       //靜态隻讀隻能在類型構造器中被初始化

       private static readonly string readonlyfield="我是初始值";

       //類型構造器

       static  readonlyandconst()

       {

           readonlyfield = "改變靜态隻讀字段的值";

       }

       private string instancefield = "執行個體字段";

       //執行個體構造器

       public readonlyandconst()

           instancefield = "改變執行個體隻讀字段的值。";

   }

   我在其前面說了const邏輯上是static的,我們可以借助il代碼看下就明白了。

淺談readonly和const

看到沒,我沒說謊吧。

說到這兒,我突然記起來一道面試題,我一個朋友去面試人家問他abstract可以不可以和static連用,當時他懵了,不過憑直覺還是給了一個不能。但是後來問我是我說不能時,他繼續問我為什麼,其實如果知道了靜态類最終會被編譯成abstract的類,就會知道abstract和static不能聯合使用了。其實,很多時候都被微軟的一些設計所折服,就拿那幾關鍵字來說,如果我問vitrual、abstract、static可不可以組合使用,vitrual類可不可被abstract類基礎,或者反之。

     首先,我們可以這麼了解,在clr中我們知道在建構一個執行個體對象時首先要做的是加載類型對象,類型對象有類型構造器來完成。而這些類型執行個體對象我們可以叫他們原型或者模闆。微軟在将static類編譯時編譯成了abstract的,是以我們可以肯定abstract不可能和static連用,那麼virtual和static呢,答案是否定的,為什麼?我們不做驗證,virtual是虛拟的,是會被繼承者改寫的,那麼好,如果說我們運作static和virtual聯合使用,那就會出現一個大問題!static修飾的成員我叫她為類型成員,什麼意思?也就是說這個成員為所有這個類型執行個體所共享,那完了,你一改其他執行個體對象全都改了,這絕對是不允許的,所有我也不做驗證,virtual和static絕對不能聯合使用,ok結論已然明顯,static和abstract以及virtual都能不組合使用。

      但是virtual和abstract可以有繼承關系嗎?我也不想驗證了,給個結論吧,自己悟出來的,如果有誤,請看官給我斧正。這個結論就是出來密閉類和私有類、靜态類、最終類不能被繼承外,其他的引用類型都是可以繼承的。

       這裡提一個問,突然想到的,static 修飾的類是什麼類型?提示關鍵字class。