![](/img/trans.png)
[英]C# string(char[]) constructor with oversized array fails equality comparison
[英]String comparison for equality in an object array: unexpected false
考慮以下:
using System;
namespace ObjectArrayWeirdness
{
public class Program
{
public static object[] Change(object[] set)
{
object[] result = new object[set.Length];
// If the following two lines are replaced with:
// result[0] = "ab";
// then ArrayEquals will evaluate true.
result[0] = "a";
result[0] += "b";
return result;
}
public static bool ArrayEquals(object[] a, object[] b)
{
if (a.Length != b.Length) return false;
for (int i = 0; i < a.Length; i++)
{
if (a[i] != b[i])
{
return false;
}
}
return true;
}
static void Main(string[] args)
{
object[] expected = { "ab" };
object[] actual = Change(new object[] { 1 });
Console.WriteLine(ArrayEquals(expected, actual));
}
}
}
輸出:
false
輸出result[0].GetType()
:
System.String
我的問題:
ArrayEquals
的比較是否因為比較對象引用而不是值而失敗?
如果是這樣,為什么在一步中(不使用+=
)將正確的字符串分配給result[0]
時,為什么成功?
我必須承認我期望正常的字符串比較,因為GetType()
將a[0]
和b[0]
都識別為字符串。
ArrayEquals中的比較是否因為比較對象引用而不是值而失敗?
是
如果是這種情況,為什么一步一步將正確的字符串分配給result [0]時,為什么成功?
這是編譯器優化。 當您在編譯時聲明兩個相同的文字字符串時,編譯器會將它們折疊到單個對象實例中以節省空間。 但是,如果字符串是在運行時構造的,則最終會有兩個單獨的字符串對象。
那正是發生了什么。 您正在比較對象引用。 但是請注意,字符串會覆蓋==
和!=
運算符以比較文字。 因此,如果將數組項轉換為字符串,則比較將按預期工作:
if ((string)a[i] != (string)b[i])
{
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.