簡體   English   中英

對象數組中相等性的字符串比較:意外的false

[英]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));
        }
    }
}

Dotnetfiddle為方便

輸出:

false

輸出result[0].GetType()

System.String

我的問題:

  1. ArrayEquals的比較是否因為比較對象引用而不是值而失敗?

  2. 如果是這樣,為什么在一步中(不使用+= )將正確的字符串分配給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.

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