C# 中的运算符 ==、相等方法和 Object.ReferenceEqual

Operator ==, Equal Method and Object.ReferenceEqual in C#

今天,我正在阅读有关 == 运算符、Equal 函数和 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 行 - 输出为假。

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

第 3 行 – 输出为真。

问题2,这里我在做casting,所以我get True了。为什么?

第 4 行。输出为 False。

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

第 5 行。输出为 False。

问题3,我在做casting,还是报False。为什么?

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

问题一: 只有 return 如果类型是 Int32 才为真,但它是一个字符串 https://msdn.microsoft.com/en-us/library/de3wwa8z(v=vs.110).aspx

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

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

问题四: == 与 referenceequal 相同,除了 string。但是 == 运算符可以被重载,所以如果你想测试身份,使用 ReferenceEquals https://msdn.microsoft.com/nl-nl/library/6a71f45d.aspx

Equal function check value of the object. Here we have same value, but I am getting False. WHY?

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

Here I am doing casting, so I am getting True. WHY?

您没有进行转换,您正在将 5 转换为其十进制字符串表示形式,即 "5"

Here I am doing casting, but still I am getting False. WHY?

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

What is difference between == Operator and Object.ReferenceEqual?

Object.ReferenceEqual 忽略运算符 ==.

可能的重载

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

Operator == It is used for check equal references.
Equal Method - It is used for check equal values.

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 指向的对象不同,因此答案为假。