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;
}
參考資料: