【问题标题】:Operator ==, Equal Method and Object.ReferenceEqual in C#C# 中的运算符 ==、Equal 方法和 Object.ReferenceEqual
【发布时间】:2023-11-03 07:29:01
【问题描述】:

今天,我正在阅读有关 == 运算符、Equal 函数和 Object.ReferenceEqual 方法的内容。

  • 运算符 == 用于检查相等引用。
  • 相等方法 - 用于检查相等值。
  • Object.ReferenceEqual – 用于检查相等引用。

我创建了一个测试控制台应用程序。我有几个问题。如果你把所有的答案都给我,对我会有帮助。

class Program
{
    static void Main(string[] args)
    {

        int intValue = 5;
        string strValue = "5";
        Console.WriteLine(string.Format("{0}  ", intValue.ToString() == strValue));// Output is TRUE
        Console.WriteLine(string.Format("{0}  ", intValue.Equals(strValue))); // Output is FALSE
        Console.WriteLine(string.Format("{0}  ", intValue.ToString().Equals(strValue))); // Output is TRUE 
        Console.WriteLine(string.Format("{0}  ", object.ReferenceEquals(intValue, strValue)));// Output is FALSE
        Console.WriteLine(string.Format("{0}  ", object.ReferenceEquals(intValue.ToString(), strValue)));// Output is FALSE


        Console.Read(); 
    }

我在输出中有五行。

第 1 行 – 输出为真。

据我所知,我在这里进行选角。所以我得到了 TRUE 作为 == 运算符检查参考。

第 2 行 – 输出为 False。

问题1. 对象的相等函数校验值。在这里,我们有相同的价值,但我得到了 False。为什么?

第 3 行 - 输出为真。

问题 2。我在这里进行铸造,所以我得到了 True。为什么?

第 4 行。输出为 False。

据我所知,这两个对象都是不同的类型。所以,我得到了 FALSE。

第 5 行。输出为 False。

问题 3。我在这里进行投射,但我仍然得到 False。为什么?

问题 4. == Operator 和 Object.ReferenceEqual 有什么区别?

【问题讨论】:

  • 运算符 == 已在字符串上重载,并比较它们的值而不是它们的引用。
  • 您的问题是关于强制转换,但您的示例代码中绝对没有显示强制转换。
  • 请先阅读Object.Equals 文档。 “当前实例与obj参数比较的类型取决于当前实例是引用类型还是值类型。”。所以“它用于检查相等值”是不正确的。

标签: c# .net equality equals-operator referenceequals


【解决方案1】:

请从这些陈述中清醒过来:

运算符 == 用于检查相等引用。
相等方法 - 用于检查相等值。

operator==Equals 都可以被覆盖以修改它们的行为。由于operator== 不是虚拟的,因此在编译时就知道选择了哪种方法,但Equals 在运行时根据对象类型选择。 (选择合适方法的整个过程称为方法解析)

第 1 行:正确。因为string.operator== 由编译器选择,它比较的是字符串而不是它们的引用。

第 2 行:错误。因为int.Equals(object) 是由编译器选择的,而object(strValue) 是字符串而不是intint 不等于 string 所以它是假的。

第 3 行:正确。因为string.Equals(string) 是由编译器选择的,它会检查值的相等性而不是引用。

第 4 行:错误。因为object.ReferenceEquals 检查引用相等,所以答案很明显。

第 5 行:错误。和上面一样。 intValue.ToString() 在内存中创建了一个值为“5”的新字符串对象,它与strValue 指向的对象不同,因此答案是否定的。

【讨论】:

    【解决方案2】:

    对象的相等函数检查值。在这里我们有相同的价值,但我得到了 False。为什么?

    不同类型的对象不可能有相同的值。第一个对象的整数值为 5,而第二个对象的字符串值为 "5"。字符串"5" 是整数值 5 的一种可能的表示 - 即它的十进制表示。但是,它不是相同的值。毕竟,你不会期望"101" 等于 5,即使 101 是 5 的二进制表示。

    我在这里做演员,所以我得到了真实。为什么?

    您不是在进行强制转换,而是将 5 转换为其十进制字符串表示形式,即"5"

    我在这里进行铸造,但我仍然得到 False。为什么?

    因为你得到了一个内容相同的不同对象(即一个字符串,其中包含字符"5")。

    == 运算符和Object.ReferenceEqual 有什么区别?

    Object.ReferenceEqual 忽略运算符 == 可能的重载。

    【讨论】:

      【解决方案3】:

      问题 1: 仅当类型为 Int32 时才返回 true,但它是字符串 https://msdn.microsoft.com/en-us/library/de3wwa8z(v=vs.110).aspx

      问题 2: 如果值相同,则 string.Equals 返回 true,它们在两种情况下都是:“5”。 https://msdn.microsoft.com/en-us/library/system.string.equals(v=vs.110).aspx

      问题 3: 它们指向不同的对象,因此 ReferenceEqual 返回 false https://msdn.microsoft.com/nl-nl/library/system.object.referenceequals(v=vs.110).aspx

      问题 4: == 与 referenceequal 相同,但字符串除外。但是 == 运算符可以重载,所以如果要测试身份,请使用 ReferenceEquals https://msdn.microsoft.com/nl-nl/library/6a71f45d.aspx

      【讨论】: