2016-07-02 50 views
-1

今天,我正在阅读有关==运算符,Equal函数和Object.ReferenceEqual方法。运算符==,等于方法和Object.ReferenceEqual在C#

  • 运算符==它用于检查相等的引用。
  • 等方法 - 它用于检查相等的值。
  • Object.ReferencEqual - 它用于检查相等的引用。

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

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.对象的等功能检查值。这里我们有相同的价值,但我得到了假。为什么?

第3行 - 输出为真。

问题2在这里我正在铸造,所以我变得真实。为什么?

第4行。输出错误。

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

第5行。输出错误。

问题3在这里,我正在铸造,但我仍然得到假。为什么?

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

+0

==操作符已被重载的字符串,并比较它们的值不是他们的引用。 – dotctor

+2

您的问题涉及到投射,但您的示例代码中绝对没有显示投射。 –

+0

请首先阅读[Object.Equals](https://msdn.microsoft.com/en-us/library/bsc2ak47(v = vs.110).aspx)文档。 “当前实例和obj参数之间的比较类型取决于当前实例是引用类型还是值类型。”所以“它用于检查相等的值”是不正确的。 –

回答

1

请从这些语句头脑清醒:

运营商==它被用于检查相等引用。
等方法 - 它用于检查相等的值。

可以覆盖operator==Equals以修改它们的行为。由于operator==不是虚拟的,因此在编译时知道选择了哪种方法,但是在运行时基于对象类型选择了Equals。 (选择合适方法的全过程称为方法分辨率)

第1行:真。由于string.operator==已被编译器选择,它比较字符串而不是它们的引用。

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

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

线路4:假。因为object.ReferenceEquals检查参考平等,所以答案是显而易见的。

5号线:假。同上。 intValue.ToString()创建与“5”值内存新的字符串对象,并为strValue点,所以答案是假的是不是同一个对象。

0

问题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

1

同等功能检查值。这里我们有相同的价值,但我得到了假。为什么?

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

在这里,我正在进行铸造,所以我变成了True。为什么?

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

在这里,我正在铸造,但我仍然得到假。为什么?

因为您获得了一个具有相同内容的不同对象(即其中包含字符"5"的单个字符串)。

==运营商和Object.ReferenceEqual有什么区别?

Object.ReferenceEqual忽略运营商==的可能超载。