gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:21:34 25 4
gpt4 key购买 nike

我对这段代码感到困惑,这两种情况有什么区别?为什么结果不一样?

Example Number 1 - 没有相同的 datatype w/相同的值,但它返回相同的结果true

 int value1 = 'a';
char value2 ='a';
Console.WriteLine(value1 == value2);
Console.WriteLine(value1.Equals(value2));



示例编号 2 - 它们具有相同的 datatype 和相同的值,但它返回 假与真

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

应该会提示您此代码行为的原因是什么。有一个从 charint 的静默转换。事实上,编译的内容根本没有提到这个变量的 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));

这里首先声明了两个object变量,这个很重要,然后给他们相同的string value,虽然他们是两个不同的实例

那么让我们来处理第一个比较:

obj1 == obj2

这是使用为 object 定义的 == 运算符完成的,它比较引用。由于我们已经确定您对第二个变量的时髦字符串构造构造了一个新实例,因此引用比较表明它们是不同的。

之所以使用在 object 上定义的 == 运算符,而不是在 string 上定义的 on,是因为运算符是resolved 在编译时,在编译时编译器只知道变量是 object 类型。它们包含字符串的事实,甚至编译器可以“看到”您刚刚为它们分配了字符串的事实,因此它应该使用 string ==相反,运算符被忽略。

但是,当您这样做时:

obj1.Equals(obj2)

那么你正在调用 virtual .Equal(object other)object 中声明,它被覆盖string 中,因此你得到字符串 content 比较,这表明它们是相同的。

所以让我们把第二段代码也变得 super 清晰:

object obj1 = "Object One";
object obj2 = new string("Object One".ToCharArray());
Console.WriteLine(obj1.ReferenceEquals(obj2)); // <-- changed
Console.WriteLine(obj1.Equals(obj2));

关于c# - 使用 [==] 运算符和 .Equals() 的 Int、Char、Object 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50851308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com