區域常數(Local Constants)
區域常數與區域變數十分相似,差異在於:常數初始化之後,數值無法修改。
和區域變數相同,常數必須在程式區塊內宣告。
常數有兩項核心特性:
- 宣告時一定要給予初始值;
- 宣告完成後,數值不允許變更。
常數基礎語法
const 型別 常數名稱 = 初始值;
// const:關鍵字,必須緊接在型別前方
// = 初始值:不可省略,屬強制要求
Code language: JavaScript (javascript)
語法規則說明
相較一般欄位 / 變數宣告,有兩處不同:
- 在資料型別前方加上
const關鍵字; - 必須提供初始值,而且該數值在編譯階段就能確定:
- 通常是基礎型別字面常數、由基礎型別構成的運算式;
- 可以指派
null; - 不能指派物件實體參考(物件參考要等到執行階段才會確認,不符合編譯期常數的規定)。
class Program
{
static void Main()
{
int a = 10; //這是一個變數
const int b = 20; //這是一個常數,外觀和變數很像
//前方加上 const 關鍵字代表這是常數
a = 100; //變數可以重新指派
a = 200; //不論修改多少次都沒問題
// 錯誤寫法
b = 300; //常數無法修改,編譯器會回報錯誤
//使用常數的好處是提升程式碼可讀性與維護性
int c; //宣告變數
c = 12; //變數允許宣告與指派分開撰寫
//常數不允許宣告與初始化分開
// 錯誤寫法
const double d; //宣告
d = 3.14; //變數可以這樣寫,常數不行
}
}Code language: C# (cs)

上面兩個錯誤,第一個是嘗試修改常數數值;第二個是常數宣告與初始化分開,常數的宣告和初始指派必須同時完成。
class 物件能不能做為常數?
指派給常數phone的運算式必須是編譯期常數
new Phone()會在程式執行時配置堆積記憶體、建立物件,屬於執行階段數值;
C# 不允許將執行階段物件參考指派給const區域常數,會直接觸發 CS0133 編譯錯誤。
class Program
{
static void Main()
{
const Phone phone = new Phone();
}
}
class Phone
{
}Code language: C# (cs)

關鍵字補充說明
const不屬於修飾子,它是宣告語法的核心部分,必須直接寫在資料型別前方。
前面提到的 private、public、protected 等才是修飾子。
有效範圍規則與範例
區域常數與區域變數的有效範圍規則完全相同:在方法 / 程式區塊內宣告,當區塊執行結束,常數就會失效、離開有效範圍。
void ShowArea()
{
const double PI = 3.1416; // 宣告區域常數PI
for (int radius = 1; radius <= 5; radius++) //迴圈輸出半徑1到5的圓面積
{
double area = radius * radius * PI; // 讀取常數PI的值
Console.WriteLine($"半徑: {radius}, 面積: {area}");
}
}
Code language: C# (cs)
常數PI只在ShowArea方法內有效,方法執行完畢就會被釋放。
class Program
{
static void Main()
{
ShowArea();
}
static void ShowArea()
{
const double PI = 3.1416;
for (int radius = 1; radius <= 5; radius++)
{
double area = radius * radius * PI;
Console.WriteLine($"Radius: {radius}, Area: {area}");
}
}
}
Code language: C# (cs)

區域常數
Previous: 巢狀程式碼區塊與作用域
Next: 程式控制流程