參照question爲什麼下面的代碼總是返回true? [c#語言]爲什麼字符串變量的==返回true?
String a= "hello";
String b= "hello";
if(a==b)
Console.WriteLine("Is it really reference type?");
只是想解釋爲什麼他們在這裏表現爲值類型而不是引用類型。是否有任何關於這個OR的MSDN文檔,我應該記住這個異常還是這是完全合乎邏輯的,但我沒有得到它?
詳細解釋讚賞。
參照question爲什麼下面的代碼總是返回true? [c#語言]爲什麼字符串變量的==返回true?
String a= "hello";
String b= "hello";
if(a==b)
Console.WriteLine("Is it really reference type?");
只是想解釋爲什麼他們在這裏表現爲值類型而不是引用類型。是否有任何關於這個OR的MSDN文檔,我應該記住這個異常還是這是完全合乎邏輯的,但我沒有得到它?
詳細解釋讚賞。
任何類都可以覆蓋==
運算符以提供自定義比較。 Documentation。
這就是String
類所做的 - 它只是爲比較提供了不同的含義 - 它檢查字符串值而不是對象引用。
如果你真的想檢查實例指向同一個參考,使用object.ReferenceEquals(a, b)
至於串去,他們實際上是在這種情況下,相同的標記 - 編譯器將檢測到的字符串值是完全相同同樣的,只是將它們存儲在內存中。這裏有一些關於String.Intern
的內容在.NET字符串中的處理方式有點不同。儘管它們是引用類型,但它們似乎充當了值類型。
這樣做的根本原因是字符串是不可變的和唯一的。這意味着當你定義字符串a時,值「hello」被保存在堆上。
當您定義字符串b併爲其賦值「hello」時,它會知道在堆上已經有一個具有該值的字符串,並創建一個指向該字符串的指針。它可以安全地做到這一點,因爲字符串是不可變的,因此CLR知道該字符串永遠不會被修改。任何修改字符串的操作都只會導致在堆上分配一個新字符串。
雖然String
是引用類型,但字符串的==
運算符已被重載以檢查值相等性而不是引用相等性。微軟建議對於具有值語義引用類型做到這一點:
但是,如果要實現的即意 有值語義,如複數類型的引用類型,你必須重寫 平等運算符。
有關更多詳細信息,請參見Object.Equals Method (Object)。
太棒了!最後我明白這是如何工作的。它基本上是這樣定義的運算符==,只是爲了比較值而不是引用。感謝您分享MSDN路徑。 –