靜態成員(static)屬於類別本身;非靜態成員屬於每個實例。兩者在記憶體佈局與存取規則上有本質差異。
class Test {
int x; // 非靜態
static int y; // 靜態
void F() { x=1; y=1; } // ✅ 非靜態方法可存取兩者
static void G() { /*x=1;*/ y=1; } // ❌ 靜態方法不可存取非靜態 x
static void Main() {
Test t = new Test();
t.x = 1; // ✅ 實例存取非靜態
// t.y = 1; // ❌ 實例存取靜態(建議類別名存取)
// Test.x = 1; // ❌ 類別存取非靜態
Test.y = 1; // ✅ 類別存取靜態
}
}
| 非靜態成員 | 靜態成員 | |
|---|---|---|
| 擁有者 | 實例 | 類別 |
| 記憶體拷貝數 | 每實例一份 | 整個 AppDomain 一份 |
| 存取路徑 | instance.Member | Type.Member(推薦) |
| 靜態方法中存取 | ❌ 無 this | ✅ 共享單一拷貝 |
instance.StaticMember(編譯警告 CS0179)。