錯誤代碼
Button btn1 = new Button();
Form1.Controls.Add(btn1); // 編譯錯誤:需要物件參考
正確代碼
Button btn1 = new Button();
this.Controls.Add(btn1); // 或 this.Controls.Add(btn1); 在 Form 類別內部
根本原因:類別 vs 實例
| 概念 | Form1 | this |
| 性質 | 類別型別 | 目前實例參考 |
| 存取成員 | 僅限 static 靜態成員 | 所有實例成員(欄位、屬性、方法、事件) |
| Controls | 非靜態實例屬性 | 當前表單的控制項集合 |
記憶體模型圖解
型別定義區:
class Form1 : Form { // 類別藍圖
ControlCollection Controls; // 實例屬性
}
堆區(執行時):
Form1 實例 A (this) ──→ Controls 集合 A
Form1 實例 B ──→ Controls 集合 B
Form1.Controls ❌ 無意義:哪個實例的 Controls?
this.Controls ✅ 明確:目前執行代碼所屬實例的 Controls
VB6 遷移者常見誤區
VB6 允許 `Form1.Controls.Add(...)` 直接用類別名存取預設實例(編譯器隱式建立/取得全域預設實例)。C# 無此機制,必須使用實例參考。
其他常見情境