簡體   English   中英

“布爾”作為對象與“字符串”作為對象測試相等性

[英]“bool” as object vs “string” as object testing equality

我是C#的新手,今天我注意到一些有趣的東西,我想我從未注意到過,或者也許我錯過了一些東西。 這是一個NUnit測試,舉一個例子:

object boolean1 = false;
object booloan2 = false;
Assert.That(boolean1 == booloan2);

此單元測試失敗,但是此通過:

object string1 = "string";
object string2 = "string";
Assert.That(string1 == string2);

對於第一個未能將其視為boolean1和boolean2是不同的引用,我並不感到驚訝。 但是令我困擾的是,第一個失敗了,而第二個失敗了。 我(在某個地方的MSDN上)讀到,對String類做了一些魔術來簡化此過程。 我認為我的問題確實是為什么這種行為沒有在bool中復制? 請注意,如果將boolean1和2聲明為bool ,則沒有問題。

這些差異的原因是什么?為什么采用這種方式? 是否有一種情況需要引用bool對象來獲取除其值以外的任何內容?

這是因為字符串實際上是在引用相同的實例。 字符串是固定的,以便重復使用唯一的字符串。 這意味着在您的代碼中,兩個字符串變量將引用相同的內部字符串實例。

您可以在這里閱讀有關它的更多信息: .NET和C#中的字符串Jon Skeet撰寫

更新
只是為了完整性; 正如Anthony指出的,字符串文字是interned,可以用以下代碼顯示:

object firstString = "string1";
object secondString = "string1";
Console.WriteLine(firstString == secondString); // prints True

int n = 1;
object firstString = "string" + n.ToString();
object secondString = "string" + n.ToString();
Console.WriteLine(firstString == secondString); // prints False

運算符重載。

布爾類沒有重載的==運算符。 String類可以。

正如Fredrik所說,您正在使用布爾比較進行參考比較。 字符串方案起作用的原因是因為==運算符已被字符串重載以進行值比較。 請參閱MSDN上的System.String頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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