![](/img/trans.png)
[英]Question about Object Identity and Object Equality and String class exception
[英]Question about string and object equality in C#
我們知道,在 C# 中,
定義了以下變量:
string s1 = "foo";
object s2 = "foo";
string s3 = new String(new char[] {'f','o','o'});
bool b1 = (s1==s2); //true
bool b2 = (s2==s3); //false
bool b3 = (s1==s3); //true
bool b4 = (s1.equals(s3)); //true
gettype() 對於所有變量 s1、s2 和 s3,返回相同的 val 字符串。
為什么 s1==s3 為真而 s2 == s3 為假? s1 和 s2 具有相同的類型 - 所以 == 運算符的行為應該相同。 據我了解,s1 和 s2 也實習了。 (object.ReferenceEquals(s1, s2) 返回 True。)
我想念什么?
為什么 object == string 與string.operator == (string, string)
不匹配? 因為其中一個參數不是字符串......所以下一個匹配的是object.operator ==
,它不作為字符串comaprison。
為什么字符串的實習版本(s1 和 s2)指向同一個對象? 因為這是實習生所做的 - 確保相同的值僅作為對象出現一次。 特別是它是針對同一模塊中的所有字符串常量(由編譯器自行決定)完成的,因此 s1 和 s2 都指向相同且唯一的對象,該對象代表該程序集中的"foo"
。
為什么非實習字符串 (s3) 與 (s1/s2) 不是同一個對象? 因為它只是不一樣 - 在運行時創建字符串不會實習字符串。
== 運算符(以及 C# 中的任何運算符重載)是靜態方法,因此調用的運算符由參數的靜態類型選擇。 在(s2==s3)
中,左手操作數的靜態類型是object
,因此它不能匹配operator ==(string, string)
方法的簽名。
嘗試s2.Equals(s3)
代替。 Equals
是一個虛函數,因此對 s2 的動態類型(即string
。 (這也是s2.GetType()
返回string
的原因)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.