compile-time constant、run-time constant、const、readonly

 

如下例子,當遇到

「Default parameter value for 's' must be a compile-time constant」錯誤訊息,

什麼是 compile-time constant?

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

        }
    }

    class MyClass
    {
        private string myString = "test";
        public string MyFunction(string s = myString)
        {
            return s;
        }
    }
}

Constant 可以是 numbers, Boolean values, strings, or a null reference。

 

一、const

1、const 是屬於 compile-time Constant。

2、當你所宣告的 const 內容有改動時,需要 recompiled。

3、一個 const 欄位可以參與另一個 const 欄位

public const int C1 = 5;
public const int C2 = C1 + 100;

4、static modifier 不得出現在 const 宣告上。

5、const 在類別裡被使用時,該變數會被隱含成 static

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(MyClass.myField);
        }
    }

    class MyClass
    {
        public const string myField = "myField";
    }
}

執行畫面

 

二、readonly

1、readonly 是 run-time constant。

2、readonly 不能用在 class 與 struct 上,但在 C# 7.2,開放 readonly 可以用在 struct 上。

3、被宣告成 readonly 的物件在 constructor 可以被重復 assign 值給他。

class Me
{
    readonly string name = System.String.Empty;
    Me()
    {
        name = "Tom";
        name = "Bill";
    }
}

 

三、const 與 readonly 的差異

1、const 是編譯時賦予值,readonly 是執行時賦予值。

2、readonly 可以在 constructor 被改變,const 則否。

class Person
{
    const string name = "";
    Person(int name)
    {
        this.name = name;
    }
}

class Age
{
    readonly int year = 10;
    Age(int year)
    {
        this.year = year;
    }
}

3、readonly 可以指定 runtime constants 給他,const 則否。

class You
{
    const string name = System.String.Empty;
}





class Me
{
    readonly string name = System.String.Empty;
}

 

參考資料:

Runtime And Compiletime Constants In C#

const (C# Reference)

readonly (C# Reference)