首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 基類 System.Object 與存取修飾符完整指南:ToString、GetHashCode、Equals 核心方法解析

     編輯:關於C語言

一、System.Object:所有型別的終極基類

C# 類型系統採單一繼承樹,所有類別隱含繼承 System.Object。因此任何物件都擁有 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建立淺層複製值類型欄位複製值,參考類型複製參考

三、高頻方法實戰範例

1. ToString():物件的字串面貌


double f = Math.PI;
string s = f.ToString(); // "3.14159265358979"
Console.WriteLine($"原始值: {f}, 字串: {s}");

ToString執行結果

最佳實務:自訂類別務必覆寫 ToString() 回傳有意義的業務描述,利於除錯、日誌、UI 顯示。

2. GetHashCode():雜湊容器的關鍵


string s1 = "ludei", s2 = "ludei", s3 = s1;
Console.WriteLine(s1.GetHashCode()); // 相同內容通常相同雜湊碼
Console.WriteLine(s2.GetHashCode());
Console.WriteLine(s3.GetHashCode());

GetHashCode執行結果

規則:若 Equals 回傳 true,GetHashCode 必須相等。覆寫 Equals 時必須同步覆寫 GetHashCode。

3. GetType():執行期型別檢視


object obj = "Hello";
Type t = obj.GetType();
Console.WriteLine(t.FullName); // System.String
Console.WriteLine(t.IsPrimitive); // False

4. Equals 與 ReferenceEquals:相等性的兩個維度


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(會裝箱產生不同物件)。

四、C# 存取修飾符完整對照表

修飾符中文語意存取範圍適用目標
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 的關鍵知識點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved