加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用[==]运算符和.Equals()的Int,Char,Object数据类型

发布时间:2020-12-15 19:29:02 所属栏目:百科 来源:网络整理
导读:我对这段代码感到困惑,这两个条件有什么区别?为什么结果不一样? 示例编号1 – 不具有相同值的相同数据类型,但它返回相同的true结果 int value1 = 'a'; char value2 ='a'; Console.WriteLine(value1 == value2); Console.WriteLine(value1.Equals(value2));
我对这段代码感到困惑,这两个条件有什么区别?为什么结果不一样?
示例编号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:

The implicit numeric conversions are:

From char to ushort,int,uint,long,ulong,float,double,or decimal

这意味着所写的内容实际上相当于:

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));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读