【问题标题】:How does .NET compiler compare two strings?.NET 编译器如何比较两个字符串?
【发布时间】:2010-04-12 09:55:11
【问题描述】:
string a="I am comparing 2 string";
string b="I am comparing 2 string";

if(a==b)
  return true;
else
  return false;

.NET 编译器如何比较两个字符串?字符串是否像 struct(int) 一样工作? string 是类,所以 a=b 表示我们正在比较 2 个对象,但我想比较 2 个值。

【问题讨论】:

  • 不要迂腐,但 int 是结构(值类型),而字符串是类(引用类型)。

标签: c# string-comparison


【解决方案1】:

String 类重载了== 运算符,所以是的,它比较字符串的值,就像比较像int 这样的值类型。

(顺便说一句,编译器还在代码中实习文字字符串,所以字符串变量ab实际上将引用同一个字符串对象。如果你使用Object.ReferenceEquals(a,b),它也会返回@ 987654327@.)

【讨论】:

【解决方案2】:

System.String 是一个重载了== 运算符以比较字符串内容的类。这允许它在比较中是“类似值”,但在其他方面仍然是引用类型。

【讨论】:

    【解决方案3】:

    虽然字符串是引用类型,但定义相等运算符(== 和 !=)是为了比较字符串对象的值,而不是引用。这使得字符串相等性的测试更加直观。

    C# string

    【讨论】:

      【解决方案4】:

      字符串由运行时比较,而不是编译器。比较由Equality 运算符执行。

      【讨论】:

        【解决方案5】:

        这里有不同的注意事项。

        首先,所有相同的常量字符串都将被保留,以便两个引用都等于开头。因此,即使你在这里做了ReferenceEquals(),你也会得到“真”的结果。因此,仅对于构建的字符串(例如使用StringBuilder,或从文件中读取等),您会得到另一个引用,因此在进行引用相等比较时会出现错误。

        如果在编译时这两个对象都是字符串,编译器将发出代码来比较它们的值(System.String 上的== 重载运算符),而不是它们的引用。请注意,一旦您将其与 object 类型引用进行比较,情况就不再如此了。

        不执行运行时检查来按值比较字符串,并且编译器不会为 == 运算符发出 .Equals() 调用。

        【讨论】:

          【解决方案6】:

          请注意,您的问题有点棘手。因为 ReferenceEquals 也将返回 true。

          这是因为实习:http://en.wikipedia.org/wiki/String_interning

          【讨论】:

            猜你喜欢
            • 2015-02-13
            • 1970-01-01
            • 2022-06-29
            • 1970-01-01
            • 1970-01-01
            • 2013-02-27
            • 2019-01-14
            • 2022-01-22
            • 1970-01-01
            相关资源
            最近更新 更多