请参见以下代码:

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相关问答推荐

将多行参数传递给Power Shell中的DotNet Pack命令

无法在 Blazor Server 应用程序中触发 InputRadio 的 onchange 事件

Visual Studio 2022 中的目标操作系统和目标运行时有什么区别?

在本地运行 Azure 函数会在 .NET7 升级后出现无运行时错误

在 .NET 中使用 AES 解密时缺少后半字节

将 Span 传递到函数时出现 F# 错误

如何调试 .NET 运行时中的内部错误?

如何获取控制台应用程序的执行目录

设置日志(log)文件名以在 Log4j 中包含当前日期

使用 .NET 在 Windows 中创建弹出式 toastr 通知

mstest.exe 在哪里?

我应该默认推荐密封类吗?

使用返回随机结果的函数进行单元测试

extern 在 C# 中是如何工作的?

如何在 C# 中将 HTML 转换为文本?

静态析构函数

加载程序集、查找类和调用 Run() 方法的正确方法

通过反射查找可空属性的类型

如果选中,则更改列表框项的 WPF DataTemplate

嵌套捕获组如何在正则表达式中编号?