C# 類型系統採單一繼承樹,所有類別隱含繼承 System.Object。因此任何物件都擁有 Object 定義的公共方法,掌握它們是撰寫正確、高效程式碼的前提。
| 方法 | 類型 | 用途 | 備註 |
|---|---|---|---|
ToString() | virtual instance | 回傳物件字串表示 | 預設回傳完整型別名,強烈建議覆寫 |
GetHashCode() | virtual instance | 提供雜湊碼供雜湊表使用 | 需與 Equals 一致,不可變物件適合快取 |
Equals(object) | virtual instance | 判斷值相等性 | 值類型預設比較內容;參考類型預設比較參考 |
Equals(object, object) | static | 安全比較兩物件(處理 null) | 先檢查參考相等,再呼叫 instance Equals |
ReferenceEquals(object, object) | static | 嚴格比較參考是否指向同一實例 | 不可被覆寫,永遠比較參考 |
GetType() | non-virtual instance | 取得執行期型別資訊 | 回傳 Type 物件,支援反射 |
Finalize() | protected virtual | 記憶體回收前清理非受控資源 | C# 以解構函式 ~ClassName() 語法對應 |
MemberwiseClone() | protected | 建立淺層複製 | 值類型欄位複製值,參考類型複製參考 |
double f = Math.PI;
string s = f.ToString(); // "3.14159265358979"
Console.WriteLine($"原始值: {f}, 字串: {s}");

最佳實務:自訂類別務必覆寫 ToString() 回傳有意義的業務描述,利於除錯、日誌、UI 顯示。
string s1 = "ludei", s2 = "ludei", s3 = s1;
Console.WriteLine(s1.GetHashCode()); // 相同內容通常相同雜湊碼
Console.WriteLine(s2.GetHashCode());
Console.WriteLine(s3.GetHashCode());

規則:若 Equals 回傳 true,GetHashCode 必須相等。覆寫 Equals 時必須同步覆寫 GetHashCode。
object obj = "Hello";
Type t = obj.GetType();
Console.WriteLine(t.FullName); // System.String
Console.WriteLine(t.IsPrimitive); // False
string a = "test", b = "test", c = a;
Console.WriteLine(Object.Equals(a, b)); // True(值相等)
Console.WriteLine(Object.ReferenceEquals(a, b)); // True(字串暫存池導致同參考)
Console.WriteLine(Object.ReferenceEquals(a, c)); // True
值類型永遠 ReferenceEquals = false(會裝箱產生不同物件)。
| 修飾符 | 中文語意 | 存取範圍 | 適用目標 |
|---|---|---|---|
public | 公開 | 無限制,任何組件可存取 | 類別、方法、屬性、欄位、介面 |
protected | 受保護 | 本類別及衍生類別 | 類別成員(不可用於頂層類別) |
internal | 內部 | 同一組件內 | 類別、成員 |
protected internal | 受保護或內部 | 同組件 或 衍生類別(跨組件亦可) | 成員 |
private | 私有 | 僅本類別內部 | 成員、巢狀類別 |
private protected | 私有受保護 | 同組件內的衍生類別 | 成員(C# 7.2+) |
預設存取層級:類別預設 internal,成員預設 private。
ref/out 傳址。ref 可修改參考本身(指向新物件)。
// 參考類型預設行為
void Modify(StringBuilder sb) { sb.Append("X"); } // 影響原物件
void Replace(StringBuilder sb) { sb = new StringBuilder("Y"); } // 不影響原參考
// ref 參考類型
void ReplaceRef(ref StringBuilder sb) { sb = new StringBuilder("Y"); } // 影響原參考
System.Object 定義的虛擬方法(ToString、Equals、GetHashCode)是物件語意的核心契約,正確覆寫它們是編寫專業級類別的基本功。存取修飾符則是封裝邊界的強制執行機制,合理選擇 public/protected/internal/private 能有效控制複雜度與防禦性程式設計。值/參考類型在參數傳遞時的語意差異更是避免 Bug 的關鍵知識點。