在 C# 中,變數代表一個儲存位置,每個變數都有其特定的類型,決定了可儲存的值的範圍。區域變數是在方法、屬性或索引子中宣告的變數,透過指定類型名稱與宣告子(包含變數名稱與選擇性初始值)來定義:
int a;
int b = 1;
多個同類型變數可合併宣告:
int a, b = 1;
重要規則: 變數必須先指派值才能使用。若嘗試使用未指派的區域變數,編譯器會報錯:
class Test {
static void Main() {
int a;
int b = 1;
int c = a + b; // 編譯錯誤:a 尚未指派
}
}
欄位是與類別、結構或其執行個體關聯的變數。使用 static 修飾詞宣告的欄位為靜態欄位(屬於類型本身),否則為實例欄位(屬於物件實例):
using Personnel.Data;
class Employee {
private static DataSet ds; // 靜態欄位
public string Name; // 實例欄位
public decimal Salary; // 實例欄位
}
方法參數同樣定義變數,C# 支援四種類型的參數傳遞機制:
用於「輸入」參數傳遞。引數的值會被複製到參數中,方法內對參數的修改不影響原引數:
static void F(int p) {
Console.WriteLine("p = {0}", p);
p++;
}
static void Main() {
int a = 1;
Console.WriteLine("pre: a = {0}", a); // 輸出 1
F(a);
Console.WriteLine("post: a = {0}", a); // 仍輸出 1
}
使用 ref 關鍵字,參數成為引數的別名,修改直接影響原變數:
static void Swap(ref int a, ref int b) {
int t = a; a = b; b = t;
}
static void Main() {
int x = 1, y = 2;
Swap(ref x, ref y); // 需在呼叫端也加 ref
// x=2, y=1
}
使用 out 關鍵字,呼叫端引數無需初始化,方法必須在返回前指派值:
static void Divide(int a, int b, out int result, out int remainder) {
result = a / b;
remainder = a % b;
}
static void Main() {
int ans, r;
Divide(10, 3, out ans, out r); // ans=3, r=1
}
使用 params 修飾詞,允許可變數量的引數,必須是最後一個參數且為一維陣列:
static void F(params int[] args) {
Console.WriteLine("# of arguments: {0}", args.Length);
for (int i = 0; i < args.Length; i++)
Console.WriteLine("\targs[{0}] = {1}", i, args[i]);
}
static void Main() {
F(); // 0 個引數
F(1); // 1 個
F(1, 2); // 2 個
F(1, 2, 3); // 3 個
F(new int[] {1, 2, 3, 4}); // 也可傳陣列
}
Console.WriteLine 的多載實作即運用參數陣列實現格式化字串的靈活參數傳遞。