public override bool Equals(object obj);
public bool Equals(string value);
public static bool Equals(string a, string b);
前兩個實例方法內部呼叫 CompareOrdinal 逐字元比較。第三個靜態方法先檢查參考是否相同 (ReferenceEquals),相同則直接返回 true,不再逐字元比較。
CLR 內部維護一個字串駐留表 (內部雜湊表),Key 為字串內容,Value 為堆上 String 物件參考。
"abc" 在堆上建立 String 物件並加入駐留表。"abc",直接複用駐留表中參考,不建立新物件。s1 與 "abc"、s2 與 "abc" 指向同一個物件。
string str1 = "abc";
string str2 = "abc";
// str1 和 str2 指向同一個駐留字串物件
Object.Equals(str1, str2) // true (參考相同)
StringBuilder、string.Concat、讀取檔案) 不會 自動駐留,除非呼叫 string.Intern。new string(...) 建立 String 物件 (編譯錯誤),String 為不可變參考型別,語言層面強制使用字面常數或工廠方法。