| 特性 | 靜態成員 (static) | 非靜態成員 (instance) |
|---|---|---|
| 所屬 | 類別 | 實例 |
| 儲存位置 | 高頻堆 / 靜態欄位槽 | 物件實例記憶體區塊 |
| 複製數量 | 每個程式域唯一 | 每個實例一份 |
| 初始化時機 | 類別首次存取前 (靜態建構子) | 每次 new 實例化 |
| 生命週期 | AppDomain 存活期間 | 實例被 GC 回收時結束 |
class Demo {
int _instanceField = 1;
static int _staticField = 2;
void InstanceMethod() {
_instanceField = 10; // OK,隱含 this._instanceField
_staticField = 20; // OK,類別名或直接存取
}
static void StaticMethod() {
_staticField = 20; // OK
// _instanceField = 10; // CS0120: 需要物件參考
var d = new Demo();
d._instanceField = 10; // OK,透過實例參考
}
static void Main() {
Demo._staticField = 5; // OK,類別名存取靜態
var d = new Demo();
d._instanceField = 5; // OK,實例存取非靜態
// Demo._instanceField = 5; // CS0120: 類別名不可存取非靜態
}
}
using System;
class Test {
int x; // 非靜態
static int y; // 靜態
void F() {
x = 1; // OK,等價 this.x = 1
y = 1; // OK,等價 Test.y = 1
}
static void G() {
// x = 1; // CS0120: 無法存取非靜態
y = 1; // OK
}
static void Main() {
Test t = new Test();
t.x = 1; // OK
// t.y = 1; // CS0119: 實例不可存取靜態成員 (建議用類別名)
// Test.x = 1; // CS0120: 類別名不可存取非靜態
Test.y = 1; // OK
}
}
Math.Sin, Enumerable.Where、無副作用邏輯。static readonly 組態物件。Interlocked/ConcurrentDictionary,否則競爭條件。靜態欄位持有參考型別 → 物件永不被 GC 回收 (除非手動設 null)。
// 危險:靜態清單累積物件
static List _allCustomers = new List();
void Register(Customer c) => _allCustomers.Add(c); // 永不釋放
// 改善:弱參考或定期清理
static List> _refs = new();
void Register(Customer c) => _refs.Add(new WeakReference(c));
this 基址 + 偏移,多一層間接。