请参见以下代码:

object x = "mehdi emrani";
string y = "mehdi emrani";
Console.WriteLine(y == x);

它返回true.

但是这个代码:

object x = "mehdi emrani";
string y = "mehdi ";
y += "emrani";
Console.WriteLine(y == x);

返回false.

所以当我在第一个代码中比较字符串和对象时,我得到true

这两个字符串都是相同的,但为什么当我附加到字符串时,结果返回false

推荐答案

在每种情况下,==的第二个操作数都是x,其类型为object.这意味着您使用的是普通的引用相等运算符.

现在,在第一个例子中,您使用的是具有相同内容的两个字符串constants.C#编译器将对这两个引用使用单个对象.在第二种情况下,xy引用具有相同内容的不同字符串对象.这两个引用将不同,因此==将返回False.

您可以通过以下方式修复比较:

  • 改为使用Equals-即overridden乘以string(而==运算符仅为overloaded:

    Console.WriteLine(y.Equals(x)); // or x.Equals(y), or Equals(y, x)
    

    如果其中一个参数可以为null,那么使用static Equals(object, object)方法可能会很有用;这意味着你不需要担心NullReferenceException.

  • 将两个变量都设为string类型,此时将在编译时选取string内的==重载,并且该重载将比较字符串的内容,而不仅仅是引用

值得注意的是,C#编译器注意到的不仅仅是字符串本身,而是编译时常量表达式.例如:

object x = "mehdi emrani";
string y = "mehdi " + "emrani";
Console.WriteLine(y == x); // True

在这里,y是使用两个字符串来初始化的,这两个字符串aren't与用于初始化x的字符串aren't相同,但是字符串连接是由编译器执行的,编译器意识到它是已经用于x的相同字符串.

.net相关问答推荐

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

在平板电脑上运行我的 Angular 13 和 .Net Api 项目时,它不会向 api 输入请求

无法对.NET MAUI类库进行单元测试

MassTransit RespondAsync 无法返回空值

将字符串与容差进行比较

.NET 的future 版本会支持 C# 中的元组吗?

Owin Twitter登录-根据验证程序远程证书无效

从 switch 块中跳出 foreach 循环

使用 Windows 服务和 C# 检测 USB 驱动器插入和移除

是什么让 Enum.HasFlag 这么慢?

为什么递归调用会导致不同堆栈深度的 StackOverflow?

如何使用转储文件来诊断内存泄漏?

在 .NET 中计算目录大小的最佳方法是什么?

等效于 C# 在 powershell 中的使用关键字?

文件按文件名模式存在

使用 C# 设置全局热键

让 String.Replace 只打整个单词的方法

找不到 System.Windows.Media 命名空间?

如何重新启动 WPF 应用程序?

ConfigurationManager.AppSettings - 如何修改和保存?