[C#] 006.區別readonly和const的使用方法 (程式有彈性用readonly,要效率用const)

讀【157個完美化C#的建議】一書的理解筆記 - 006

重點: 程式有彈性用readonly,要效率用const

※ 書中建議const帶來的效益不明顯,程式還是以彈性為導向

流程說明
1. Const
2. Readonly
3. 分析
4. 結論

 

1. Const

以下範例,設定Value 為 const 值為Hello 

const string Value = "Hello";

private void Form1_Load(object sender, EventArgs e)
{
       //=== const 部分 ====
       string setTalk = Value;
       Console.WriteLine(setTalk);
       //實際上邊一時為
       Console.WriteLine("Hello");
}

實際上 Value 在編譯期會變為以下,像C++ 的#DEFINE (巨集) ,編譯時將對應的常數強制替換,故效能快

Console.WriteLine("Hello");

2. Readonly

Readonly分兩種,以下範例

1: 基底型別的Readonly

宣告以下(Int 基底型別為例)

//=== Readonly 部分 1 : 宣告
//基底型別 的不可改變
readonly int ReadOnlyValue = 100;

不可以改變值,只有在編譯前賦予指定的值

//ReadOnlyValue  = 100;無法指定賦予值

2: 參考型別的Readonly

我們有以下宣告 (myClass)



public class myClass {
            //Field
            readonly int score = 10;

            /// <summary>
            /// 建構式 - 賦予Readonly值
            /// </summary>
            /// <param name="input"></param>
            public myClass(int input)
            {
                this.score = input;
            }

            /// <summary>
            /// 建構式 - 無參數
            /// </summary>
            /// <param name="input"></param>
            public myClass()
            {
            }
}

參考型別提供了在編譯運行時的設定Readonly值。

 

//參考型別 的不可改變
myClass itemA = new myClass();

//參考型別建構式 - 可以賦予內部的readonly屬性值
myClass itemB = new myClass(1234);

 

3. 分析兩者

 

基本型態

程式編譯差別

應用型別

用途

Readonly 非靜態 運行時常量 任意 設計彈性
Const 靜態 Static 編譯期常量 基底型別(int 、 string、double等)、enum   效能取向

 

 

4. 結論

在基底型別的readonly 靜態傅值 與Const宣告相等,不可以變動的量。

但在參考型別上readonly的具有可彈性

const string Value = "Hello";

static readonly string Value = "Hello";//同上面一行

程式有彈性用readonly,要效率用const

github連結(Vs2015) : 點我下載