1. 常數
常數 就是那種「魔法」變數,宣告後值就不能(也不該!)再改。想像一下你馬克杯上貼了一張超黏的貼紙寫著「只喝茶」。貼上去之後你就不能把茶換成咖啡了(至少在 C# 裡是這樣啦)。
const int DaysInWeek = 7;
const string HelloMessage = "歡迎光臨!";
常數宣告
在這些例子裡 DaysInWeek 永遠都是 7,HelloMessage 也一直都是歡迎詞。常數的值一旦設定就不能再改了。
為什麼要用常數?
- 程式碼清楚:你看到 const double Pi = 3.14159;,就知道這是常數,不會有人在程式中間突然改掉它。
- 安全性:沒有人(就算是你自己過幾個月後)能不小心把常數值改掉。
- 效能:C# 編譯器會直接把常數值插進呼叫的地方,程式會跑得快一點。
宣告語法
const 型別 名稱 = 值;
常數宣告語法
- 型別 — 任何基本型別(像是 int、double、string、char,還有 enum 跟 literal)。
- 名稱 — 通常用 CamelCase 或 PascalCase。有時候「魔法」常數會用全大寫加底線(DAYS_IN_WEEK),但 C# 不一定要這樣。
範例:
const double GRAVITY = 9.81; // 自由落體加速度,m/s^2
const char DELIMITER = ',';
const string DEVELOPER_NAME = "伊凡 彼得羅夫";
常數的特點與限制
- 值必須在編譯時就知道。意思是不能宣告一個值要等程式執行時才算出來的常數。
const int NowYear = DateTime.Now.Year; // 編譯錯誤!
- 只能用簡單型別、string 或 enum。
- 不能把陣列、物件、方法回傳值等設成常數。
- 就算是數學上看起來「簡單」的運算,也要編譯器能算出來,不能等程式執行時才算。
像這樣就不行:
const string FullGreeting = "哈囉, " + userName; // userName 是變數,這樣不行!
這樣才對:
const string DefaultGreeting = "哈囉, 使用者!";
常數通常宣告在哪?
- 在 class(或檔案)最上面、方法前面。
- 在專門放常數的 class(像 public static class Constants)。
- 如果只跟這個 class 有關,就寫在 class 裡面。
給我們 console app 的範例:
class Program
{
const string Welcome = "歡迎來到我們的應用程式!";
static void Main(string[] args)
{
Console.WriteLine(Welcome);
}
}
常數與作用域
常數的作用域跟一般變數一樣:只在宣告的範圍內看得到。
2. 關鍵字 var
關鍵字 var 不是新的變數型別,而是讓編譯器 自己從右邊判斷變數型別 的一種方便寫法。
這只是語法糖啦,沒什麼魔法,編譯後變數還是正常型別。
var age = 23; // 編譯器知道 age 是 int
var name = "安娜"; // 編譯器知道是 string
var price = 99.99; // 編譯器知道是 double
用
var 自動推斷型別
為什麼會有 var?
- 可讀性:不用手動寫一堆很長的型別(像 Dictionary<string, List<int>>)。
- 彈性:以後要改型別只要改右邊,左邊 var 會自動跟著。
- 現代風格:現在幾乎所有 C# 專案都會在型別明顯的地方用 var。
什麼時候可以(應該)用 var
- 右邊一看就知道型別。
- 型別很明顯(var price = 100; — 很明顯是 int)。
- 型別太長或太複雜(像 LINQ 查詢結果)。
var numbers = new int[] { 1, 2, 3, 4 };
var input = Console.ReadLine(); // input 是 string(方法回傳 string)
什麼時候最好不要用 var
如果右邊看不出型別,程式碼會變得難懂。過一陣子你跟同事都看不懂那是什麼型別,還是明寫比較好。
var mystery = DoSomethingVeryComplicated(); // 你是誰,mystery???
這裡最好明寫型別:
string result = DoSomethingVeryComplicated();
黃金法則:只有在不會讓程式碼難懂的時候才用 var!
var 只能用在區域變數
var 只能用在方法裡的區域變數。不能用在:
- 方法參數;
- class 屬性;
- 常數。
var 背後怎麼運作
- C# 編譯器編譯時會自動補上正確型別。
- 編譯後就沒有 var 了。
- 完全不會影響效能:只是寫程式的人方便而已。
var year = 2025; // 編譯時變成:int year = 2025;
用 var 常見錯誤
- 沒初始化變數:
var a; // 錯誤:編譯器不知道型別!
- 初始化不明確:
var list = null; // 錯誤:null 沒型別!
- 同一變數混用不同型別:
var value = 5; // value 是 int
value = "五"; // 錯誤:value 已經是 int!
比較:明寫型別 vs var
| 情境 | 明寫型別 | var |
|---|---|---|
| 型別明顯 | |
|
| 方法回傳複雜型別 | |
|
| 陣列 | |
|
小建議:
現在大多數專案都會用 var 當區域變數。參數、屬性、常數還是明寫型別比較好。
3. 小陷阱與建議
C# 裡常常會直接在程式碼寫魔法數字(像 "7"、"3.14159"、"0.15" 這種神祕數字)。這樣很糟:如果哪天要改值,就要整個專案找一遍。用常數啦! 你自己會輕鬆很多,同事也不會罵你...
var 則是另一個極端:如果你整份程式碼都用 var,但完全看不出型別,程式碼很快就變得難懂。所以 var 要用在合適、明顯的地方,其他時候就直接寫型別,不用怕麻煩。
GO TO FULL VERSION