c# - 为什么 String 在使用 == 时表现得像值类型

标签 c# .net

想知道为什么 String 在使用 == 时表现得像值类型。

         String s1 = "Hello";
        String s2 = "Hello";
        Console.WriteLine(s1 == s2);// True(why? s1 and s2 are different)
        Console.WriteLine(s1.Equals(s2));//True
        StringBuilder a1 = new StringBuilder("Hi");
        StringBuilder a2 = new StringBuilder("Hi");
        Console.WriteLine(a1 == a2);//false
        Console.WriteLine(a1.Equals(a2));//true

StringBuilder 和 String 使用 == 运算符的行为不同。 谢谢。

最佳答案

两个不同的原因;

  • 实习 - 由于 "Hello" 字符串被编译到源代码中,它们相同的引用 - 检查 ReferenceEquals(s1,s2) - 它将返回 true
  • 自定义相等 - 字符串具有相等运算符(特别是 ==/!=(又名 op_Equality/op_Inequality)

StringBuilder 版本失败,因为:

  • 它们不是相同的引用(这些是在托管堆上单独创建的常规托管对象)
  • StringBuilder 没有运算符

对每个调用 ToString(),它会变得更有趣:

  • 这两个字符串不是相同的引用
  • 但运营商支持保证 true

关于c# - 为什么 String 在使用 == 时表现得像值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1700637/

相关文章:

c# - 扩展方法解析

c# - WPF 数据绑定(bind)问题

c# - 无需序列化或填充即可将对象转换为字节数组

c# - 在 C# 中使用其他变量字符串访问变量?评价?

javascript - 无法从 Asp.NET 中的 C# 调用 javascript 函数

c# - 包含带有计时器的对象的字典。需要找出哪个对象的计时器正在调用 elapsed 事件

c# - 为什么此代码在 C# 中无效?

c# - 集中式数据库 : multiple consumers

.net - TFS Issue : No source control options (get latest, check-out, check-in) 解决方案

c# - 如何从 if 语句中的 bool 值中跳出 if 语句