c# – 使用[==]运算符和.Equals()的Int,Char,Object数据类型
我对这段代码感到困惑,这两个条件有什么区别?为什么结果不一样?
示例编号1 – 不具有相同值的相同数据类型,但它返回相同的true结果 int value1 = 'a'; char value2 ='a'; Console.WriteLine(value1 == value2); Console.WriteLine(value1.Equals(value2)); 示例编号2 – 它们具有相同值的相同数据类型,但它返回false&真正 object obj1 = "Object One"; object obj2 = new string("Object One".ToCharArray()); Console.WriteLine(obj1 == obj2); Console.WriteLine(obj1.Equals(obj2)); 解决方法
在您的问题看似简单的代码中实际上有很多事情发生,所以让我们一步一步地处理它.请注意,有很多事情可能会遗漏,请使用评论字段.
第一段代码: int value1 = 'a'; char value2 ='a'; Console.WriteLine(value1 == value2); Console.WriteLine(value1.Equals(value2)); 这一行: int value1 = 'a'; 应该给你一个关于这段代码行为的原因的提示.存在从char到int的静默转换.实际上,编译的内容并没有提到这个变量的char,它是一个数字.分配给int变量的数字是a的代码点值,即97. 第一次比较: value1 == value2 在int上使用==运算符完成,所以实际上,完成了纯数字比较,就好像字符是数字一样.这里进行相同的静默转换,将字符转换为数字.由于它是相同的字符和相同的转换,因此你也可以从这个比较中得到97. This is mentioned in the spec under section 6.1.2,Implicit numeric conversions:
这意味着所写的内容实际上相当于: 97 == 97 第二个比较: value1.Equals(value2) 使用完全相同的转换完成,因此您有: 97.Equals(97) 因此,让我们通过添加显式强制转换并将代码更改为编译器看到的代码,使第一段代码变得非常清晰: // int value1 = (int)'a'; // 97 int value1 = 97; char value2 = 'a'; Console.WriteLine(value1 == (int)value); // 97 == 97 Console.WriteLine(value1.Equals((int)value2)); // 97.Equals(97); 我还要求LINQPad向我展示这两个语句的反编译: int a = 97; int a = 'a'; 他们都编译为: ldc.i4.s 61 // 0x61 = 97 所以要清楚一点,这个静默转换是由编译器完成的,没有运行时代码将字符转换为声明的int,代码执行并编译,就像你实际编写的一样 int value1 = 97; 这就是这一部分的原因. 现在进入下一部分: object obj1 = "Object One"; object obj2 = new string("Object One".ToCharArray()); Console.WriteLine(obj1 == obj2); Console.WriteLine(obj1.Equals(obj2)); 在这里,您首先声明两个对象变量,这很重要,然后给它们相同的字符串值,尽管它们是两个不同的实例. 那么让我们来处理第一个比较: obj1 == obj2 这是使用为object定义的==运算符完成的,该运算符用于比较引用.由于我们已经确定第二个变量的时髦字符串构造构造了一个新实例,因此引用比较表明它们是不同的. 它之所以使用在对象上定义的==运算符,而不是在字符串上定义的是因为运算符在编译时被解析,并且在编译时编译器只知道变量是object类型.它们包含字符串的事实,即使编译器可以“看到”你刚刚为它们分配了字符串,以便它应该使用string ==运算符,这一事实也会被忽略. 但是,当你这样做时: obj1.Equals(obj2) 然后你调用在object中声明的虚拟.Equal(object other),它在字符串中被覆盖,因此你得到字符串内容比较,这表明它们是相同的. 所以让我们让第二段代码变得非常清晰: object obj1 = "Object One"; object obj2 = new string("Object One".ToCharArray()); Console.WriteLine(obj1.ReferenceEquals(obj2)); // <-- changed Console.WriteLine(obj1.Equals(obj2)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |