字符串比较:为什么在以下情况下我们会有不同的输出

不丹潘迪

为什么在以下情况下我们有不同的输出:

object obj = "Int32";
string str1 = "Int32";
string str2 = typeof(int).Name;
Console.WriteLine(obj == str1); // true
Console.WriteLine(str1 == str2); // true
Console.WriteLine(obj == str2); // false !?
马修·沃森

答案很简单:

当您将和object与进行string比较时,将使用引用比较,只有两个对象具有相同的引用时,该比较才为true。

比较字符串时,将使用字符串比较,如果字符串内容相同,则无论它们是否是相同的引用,该比较都是正确的。

在第三个比较中,您使用的object是比较两个内容相同但引用不同的字符串,因此它将返回false。

更为复杂的是,前两个字符串具有相同的引用,因为它们是编译时常量,并且已由interned编译器使用,因此它们引用内存中的同一字符串。

我用以下解释注释了您的原始代码:

object obj = "Int32";            // As a compile-time constant string, this will be interned.
string str1 = "Int32";           // This is also interned, so has the same reference as obj
string str2 = typeof(int).Name;  // Same contents as str1, but a different reference 
                                 // (created at runtime, so it wasn't interned)
Console.WriteLine(obj == str1);  // Reference comparison: true because the references are the same
Console.WriteLine(str1 == str2); // String comparison: true because the string contents are the same.
Console.WriteLine(obj == str2);  // Reference comparison: false because the references different.

还:

  • 如果您使用的是Resharper,它实际上会警告您进行第一次和最后一次比较,并说:“可能的意外参考比较”。
  • 您可以通过声明str2来获得相同的结果,如下所示:

    字符串str2 = string.Concat(“ Int”,“ 32”);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在以下情况下,我们应该使用redux吗?

来自分类Dev

在以下情况下我们应该把演员放在哪里

来自分类Dev

在我们已经有了char []的情况下,在c ++中使用字符串的必要性是什么?

来自分类Dev

为什么自然联接在以下情况下将输出设为空集?

来自分类Dev

为什么在以下情况下引发了不同类型的异常?

来自分类Dev

为什么在以下情况下会发生StackOverflowError?

来自分类Dev

为什么我们会在没有-的情况下?

来自分类Dev

为什么在有usbhid的情况下我们需要usbkbd驱动程序?

来自分类Dev

为什么在以下情况下我无法调用javascript AJAX函数?

来自分类Dev

我们为什么不使用==在Matlab中比较字符串

来自分类Dev

为什么我们不应该使用==比较字符串?

来自分类Dev

为什么以下字符串比较返回不同的结果?

来自分类Dev

为什么我们在mac-address字符串前面有连字符

来自分类Dev

为什么在以下情况下,我在SQL Server上具有两个条件的查询比在单个条件下的查询要快[可以改写]

来自分类Dev

为什么在使用GString的情况下,groovy映射键评估在类似情况下会有不同的表现?

来自分类Dev

为什么在使用GString的情况下,groovy映射键评估在类似情况下会有不同的表现?

来自分类Dev

为什么在这种情况下我不必引用字符串变量?

来自分类Dev

为什么我们不能比较。(点)作为if语句的圆括号内的字符串值?

来自分类Dev

为什么在以下情况下用于接口而不是类?

来自分类Dev

在以下情况下,为什么不需要对依赖类型使用typename?

来自分类Dev

为什么在以下情况下无法访问资源ID?

来自分类Dev

在以下情况下哪种数据库设计更好?为什么?

来自分类Dev

为什么在以下情况下无法进行数组转换和HTML解析的逻辑?

来自分类Dev

在以下情况下,为什么'var a = function(){}`与`function a(){}`类似?

来自分类Dev

为什么在以下情况下c ++会生成构造函数?

来自分类Dev

为什么在以下情况下用于接口而不是类?

来自分类Dev

为什么在以下情况下,角度的时区无法按预期工作

来自分类Dev

为什么在以下情况下分配后结构地址不等于

来自分类Dev

有人可以向我解释为什么python 3.4在没有我明确要求的情况下将字符串解析为int

Related 相关文章

  1. 1

    在以下情况下,我们应该使用redux吗?

  2. 2

    在以下情况下我们应该把演员放在哪里

  3. 3

    在我们已经有了char []的情况下,在c ++中使用字符串的必要性是什么?

  4. 4

    为什么自然联接在以下情况下将输出设为空集?

  5. 5

    为什么在以下情况下引发了不同类型的异常?

  6. 6

    为什么在以下情况下会发生StackOverflowError?

  7. 7

    为什么我们会在没有-的情况下?

  8. 8

    为什么在有usbhid的情况下我们需要usbkbd驱动程序?

  9. 9

    为什么在以下情况下我无法调用javascript AJAX函数?

  10. 10

    我们为什么不使用==在Matlab中比较字符串

  11. 11

    为什么我们不应该使用==比较字符串?

  12. 12

    为什么以下字符串比较返回不同的结果?

  13. 13

    为什么我们在mac-address字符串前面有连字符

  14. 14

    为什么在以下情况下,我在SQL Server上具有两个条件的查询比在单个条件下的查询要快[可以改写]

  15. 15

    为什么在使用GString的情况下,groovy映射键评估在类似情况下会有不同的表现?

  16. 16

    为什么在使用GString的情况下,groovy映射键评估在类似情况下会有不同的表现?

  17. 17

    为什么在这种情况下我不必引用字符串变量?

  18. 18

    为什么我们不能比较。(点)作为if语句的圆括号内的字符串值?

  19. 19

    为什么在以下情况下用于接口而不是类?

  20. 20

    在以下情况下,为什么不需要对依赖类型使用typename?

  21. 21

    为什么在以下情况下无法访问资源ID?

  22. 22

    在以下情况下哪种数据库设计更好?为什么?

  23. 23

    为什么在以下情况下无法进行数组转换和HTML解析的逻辑?

  24. 24

    在以下情况下,为什么'var a = function(){}`与`function a(){}`类似?

  25. 25

    为什么在以下情况下c ++会生成构造函数?

  26. 26

    为什么在以下情况下用于接口而不是类?

  27. 27

    为什么在以下情况下,角度的时区无法按预期工作

  28. 28

    为什么在以下情况下分配后结构地址不等于

  29. 29

    有人可以向我解释为什么python 3.4在没有我明确要求的情况下将字符串解析为int

热门标签

归档