1

这是 C# 代码。

class Program
    {
        static void Main(string[] args)
        {
            char [] arry = {'a', 'b', 'c'};

            String str1 = 'a' + "bc";
            String str2 = "bcd";
            String str3 = new String(arry);

            if (str1 == str2)
                Console.WriteLine("str1 == str2");
            if (str1 == str3)
                Console.WriteLine("str1 == str3");
            if (String.Equals(str1, str3))
                Console.WriteLine("String.Equals(str1, str3)");

            String str4 = GetStr();
            if (str1 == str4)
                Console.WriteLine("str1 == str4");
            if (String.Equals(str1, str4))
                Console.WriteLine("String.Equals(str1, str4)");

            if (str3 == str4)
                Console.WriteLine("str3 == str4");
            if (String.Equals(str3, str4))
                Console.WriteLine("String.Equals(str3, str4)");
        }

        public static String GetStr()
        {
            String str = "ab" + 'c';
            return str;
        }
    }

结果是..

 str1 == str3
 String.Equals(str1, str3)
 str1 == str4
 String.Equals(str1, str4)
 str3 == str4
 String.Equals(str3, str4)

为什么所有结果都说“相等!” ?? 据我所知,参考值彼此不同。所以,结果应该是“不同的!”。但不是。为什么?似乎没有理由使用 String.equal() !

4

6 回答 6

4

string.Equalsobject.ReferenceEquals.

string.Equals覆盖object.Equals(与 具有相同的语义ReferenceEquals)并通过比较字符串的值来工作。这是首要的object.Equals原因virtual

于 2013-05-30T12:21:52.527 回答
4

字符串的相等性已被覆盖以基于其值。

它检查值的状态文档String.Equals,但这也恰好是==由于string实施而造成的。

引用类型的默认相等性基于引用本身,但这很容易被覆盖......所以基本上你的断言是有缺陷的,因为它没有考虑覆盖默认行为的类型。

正如Jon 所说,可以通过object.ReferenceEquals静态方法强制引用相等,但正如Jason 所说,如果字符串已被实习,这也可能会失败。


根据 ILSpy,无论如何String.Equals最终都会使用==

public static bool Equals(string a, string b)
{
    return a == b || (a != null && b != null && a.Length == b.Length && string.EqualsHelper(a, b));
}
于 2013-05-30T12:16:25.057 回答
1

==已重载 forString以将相等性评估为值,而不是引用。来自MSDN

虽然 string 是一种引用类型,但定义相等运算符 (==!=) 是为了比较string对象的值,而不是引用。

但是,您需要注意的是,某些字符串将在编译时进行评估,编译器将对它们进行实习(即,对具有给定值的字符串进行单个引用)。因此,这些字符串也可能与引用相同(但不能保证是这种情况)。

于 2013-05-30T12:17:26.350 回答
0

每个字符串文字不一定会产生一个新的字符串实例。当根据字符串相等运算符等效的两个或多个字符串文字出现在同一程序集中时,这些字符串文字引用相同的字符串实例。例如,输出由

class Test
{
   static void Main() {
      object a = "hello";
      object b = "hello";
      System.Console.WriteLine(a == b);
   }
}

是 True 因为这两个字面量指的是同一个字符串实例。

您可以完全看到这一点:

http://msdn.microsoft.com/en-us/library/aa691090%28v=vs.71%29.aspx

于 2013-05-30T12:24:29.687 回答
0

确定两个 String 对象是否具有相同的

这意味着您的输出是完全正常的。

于 2013-05-30T12:16:32.480 回答
-1

对于比较字符串,您应该使用:

var1string.CompareTo(var2string) == 0

这是比较字符串的正确方法

所以改变:

if (str1 == str2)

有了这个:

if (str1.CompareTo(str2) == 0)

其余的也是。

于 2013-05-30T12:19:59.517 回答