如何在 C# 中使用 const,readonly,static

平時在開發時常常會用到 const,readonly,static 關鍵字,能夠確定這些關鍵詞是徹底不一樣的概念,但有時候他們在用法上很類似以致於在場景中不知道選擇哪個,這篇文章咱們就來討論 C# 中的 const,static 和 readonly 關鍵詞,放在一塊兒比較一下看看如何選擇。函數

理解 const

const 經常使用來定義一個常量,什麼意思呢?就是這個常量在你程序的生命週期內都不會被改變,所以,必須在聲明常量時爲其賦值,從技術角度上來講:這個常量值又被稱爲 編譯時 值,用 const 定義的變量又被稱爲 編譯時 常量,值得注意的是: 這個常量是不可變的,也就是一旦被定義好以後不能夠對其進行修改。code

下面的代碼片斷展現瞭如何使用 const 去定義這個 編譯時 常量。對象

const string connectionString = "Specify your database connection string here.";

必定要記住,常量必須在定義的時候給它賦值,同時也要記住不能夠用 const 定義 object 類型,由於它只支持 C# 的基元類型,好比:ints, floats, chars, booleans 和 strings,接下來經過一個例子來了解如下爲啥不能用 object,考慮下面的 Author 類。blog

public class Author
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
    }

若是用 const 將 Author 定義爲常量的話,編譯器確定是不一樣意的,以下圖:生命週期

理解 readonly

只讀關鍵詞 readonly 經常使用於將一個變量或者一個對象設置爲只讀,意味着這個變量或者對象只能在 類做用域 或者 構造函數 中被第一次賦值,一旦被賦值後,你就不能經過任何方法對其修改,除了構造函數,接下來看一個例子,考慮下面的 DbManager 類。ci

public class DbManager
    {
        public readonly string connectionString ="Specify your database connection string here.";
        
        public DbManager()
        {
            connectionString = "You can reassign a value here.";
        }
        
        public void ReAssign()
        {
            connectionString = "This is not allowed";
        }
    }

上面的代碼會編譯報錯,錯誤信息以下:作用域

理解 static

static 關鍵詞可用於 變量,方法,對象。不過值得注意的是: 類中的 static 成員只歸屬於類,而不是類實例,換句話說,能夠直接使用類名來訪問靜態屬性或者靜態方法,而不是經過類實例訪問,接下來考慮一下 Utility 類。開發

public class Utility
    {
        public static void SomeMethod()
        {
            //Write your code here
        }
    }

你不能夠經過 類實例 去調用,不然編譯器是不會放行的,以下圖:get

正確的作法以下:編譯器

Utility.SomeMethod();

一樣的規則也適用於 類中的屬性和字段,要想引用類中的靜態成員,參考以下語法:

ClassName.Member;

或者

ClassName.Member();

構造函數也能夠是靜態的,它一般用於初始化類中的靜態成員,但要注意靜態構造函數中不接受任何參數。

總結

使用 const,readonly,static 的一些經驗法則以下:

  • const

若是變量在應用程序的生命週期內不會被改變,請用 const。

  • readonly

若是你不肯定這個變量後期是否要被修改,但又不但願其餘的類碰它,請用 readonly。

  • static

若是你但願類成員是屬於類型而不是類型的實例,請用 static。

更多精彩,歡迎訂閱 👇👇👇

相關文章
相關標籤/搜索