所有 C# 類別隱含繼承 System.Object,擁有其核心方法。存取修飾符控制成員可見性,是封裝的語法基石。本文系統解析 Object 核心方法、五大存取修飾符語意,以及值型別與參考型別的記憶體行為差異。
| 方法 | 簽名 | 說明 | 常用場景 |
|---|---|---|---|
ToString() | virtual string ToString() | 物件文字表現 | 日誌、除錯、UI 顯示,建議覆寫 |
GetHashCode() | virtual int GetHashCode() | 雜湊碼 | 字典鍵、HashSet,需與 Equals 一致 |
Equals() | virtual bool Equals(obj)static bool Equals(a,b) | 值相等比較 | 值型別預設逐位比較,參考型別比較參考,建議覆寫 |
ReferenceEquals() | static bool ReferenceEquals(a,b) | 參考相等比較 | 確認是否同一實例,不可覆寫 |
GetType() | Type GetType() | 取得執行時類型 | 反射、序列化、多型判斷 |
Finalize() | protected virtual void Finalize() | 終結器 | 非託管資源釋放,建議實作 IDisposable 模式 |
MemberwiseClone() | protected object MemberwiseClone() | 淺層複製 | 原型模式,值型別複製、參考型別共享引用 |
double pi = Math.PI;
string s = pi.ToString();
Console.WriteLine($"pi={pi}, ToString()={s}"); // 字串表現
string a = "ludei", b = "ludei", c = a;
Console.WriteLine(a.GetHashCode()); // 相同內容相同雜湊
Console.WriteLine(b.GetHashCode());
Console.WriteLine(c.GetHashCode()); // 同一參考相同雜湊
object o1 = new object();
object o2 = o1;
object o3 = new object();
Console.WriteLine(Object.Equals(o1, o2)); // True (同參考)
Console.WriteLine(Object.ReferenceEquals(o1, o2)); // True
Console.WriteLine(Object.Equals(o1, o3)); // False (不同實例)
Console.WriteLine(Object.ReferenceEquals(o1, o3)); // False
| 修飾符 | 可見範圍 | 直觀含義 |
|---|---|---|
public | 無限制 | 完全公開 |
protected | 本類別 + 衍生類別 | 繼承體系內可見 |
internal | 同一組件 | 組件內部公開 |
protected internal | 同一組件 OR 衍生類別 | 組件內 + 衍生類別(邏輯 OR) |
private | 僅本類別/結構 | 完全封裝(預設) |
private protected | 同一組件 AND 衍生類別 | 組件內衍生類別(邏輯 AND,C# 7.2+) |
預設規則:類別成員預設 private;頂層類別預設 internal;介面成員隱含 public。
| 特性 | 值型別 (struct, enum, 基本型別) | 參考型別 (class, delegate, array, interface) |
|---|---|---|
| 儲存位置 | 堆疊 (區域變數) / 內嵌於物件 | 堆積 (物件),變數存參考 |
| 指派行為 | 複製值 (獨立副本) | 複製參考 (共享物件) |
| null 值 | 不可為 null (除非 Nullable<T>) | 可為 null |
| 預設值 | 全 0 位元模式 | null |
| 傳遞參數 | 傳值 (複製) | 傳參考 (複製參考) |
| 範例 | int, double, DateTime, Guid | string, List, 自訂類別 |
// 值型別
int v1 = 10; int v2 = v1; v2 = 20;
Console.WriteLine(v1); // 10 (獨立)
// 參考型別
StringBuilder r1 = new StringBuilder("A");
StringBuilder r2 = r1; r2.Append("B");
Console.WriteLine(r1); // "AB" (共享同一物件)
string s1 = "Hello"; string s2 = s1; // 參考型別但不可變
s2 = "World";
Console.WriteLine(s1); // "Hello" (字串重新指派不影響原物件)
Equals/GetHashCode/ToString 組合,確保集合正確運作IDisposable + 終結器模式管理非託管資源private,按需最小化可見範圍Object 方法與存取修飾符是 C# 類別設計的語法基石,深度理解其語意與記憶體模型,能寫出正確、高效、安全的物件導向代碼。