簡體   English   中英

C#中關於字符串和對象相等的問題

[英]Question about string and object equality in C#

我們知道,在 C# 中,

  1. 字符串是引用類型
  2. for string == 運算符已重載,以便按值執行比較

定義了以下變量:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM