C# ==运算符如何与System.Type一起工作

C# ==运算符如何与System.Type一起工作,c#,C#,这个表达式如何计算 当我使用 typeof(int) == typeof(int) 它使用对象的ToString()方法输出System.Int32。所以我假设在这个表达式中 Console.WriteLine(typeof(int)); ToString()将两者转换为System.Int32,然后比较它们的字符串。这是真的吗 或者发生了其他事情。与其他所有类一样,它通常使用相等比较器(=)系统。Type已被重写,并且两个实例之一上的Equals方法检查其相等性 typeof(int)返回

这个表达式如何计算

当我使用

typeof(int) == typeof(int)
它使用对象的
ToString()
方法输出
System.Int32
。所以我假设在这个表达式中

Console.WriteLine(typeof(int));
ToString()
将两者转换为
System.Int32
,然后比较它们的字符串。这是真的吗


或者发生了其他事情。与其他所有类一样,它通常使用相等比较器(
=
系统。Type
已被重写,并且两个实例之一上的
Equals
方法检查其相等性

typeof(int)
返回一个
Type
,因此调用
Type.Equals
。你可以看到来源

您将看到,它最终使用这个来比较两个实例:

 typeof(int) == typeof(int)

否。与其他所有类一样,它通常使用相等比较器(
=
系统。Type
已被重写,并且对两个实例之一使用
Equals
方法检查它们的相等性

typeof(int)
返回一个
Type
,因此调用
Type.Equals
。你可以看到来源

您将看到,它最终使用这个来比较两个实例:

 typeof(int) == typeof(int)

Console.WriteLine(object)的事实
打印出
字符串
并不意味着
类型
类型始终是字符串,类似于您可以打印出
int
值,而无需通过
ToString
方法查看和比较所述
int

=
操作符将测试类型的相等性,并且不会以任何方式触及
ToString()


我想,如果非要我猜的话,你会对打印东西和将它保存在内存中的区别感到有点困惑。

事实是
Console.WriteLine(object)
打印出
字符串
并不意味着
类型
类型始终是字符串,类似于您可以打印出
int
值,而无需通过
ToString
方法查看和比较所述
int

=
操作符将测试类型的相等性,并且不会以任何方式触及
ToString()


如果非要我猜的话,我想你对打印某物和将其保存在内存中的区别感到有点困惑。
typeof(int)==typeof(int)
的IL代码是

return (Object.ReferenceEquals(this.UnderlyingSystemType, o.UnderlyingSystemType));
您可以看到,它调用静态相等运算符

IL_0000:  ldtoken     System.Int32
IL_0005:  call        System.Type.GetTypeFromHandle
IL_000A:  ldtoken     System.Int32
IL_000F:  call        System.Type.GetTypeFromHandle
IL_0014:  call        System.Type.op_Equality

我们看不到这个方法在中的作用,因为它显然是一个外部方法,但我猜它要么调用该方法,要么在本机代码中执行类似的比较。

对于
typeof(int)==typeof(int)
的IL代码是

return (Object.ReferenceEquals(this.UnderlyingSystemType, o.UnderlyingSystemType));
您可以看到,它调用静态相等运算符

IL_0000:  ldtoken     System.Int32
IL_0005:  call        System.Type.GetTypeFromHandle
IL_000A:  ldtoken     System.Int32
IL_000F:  call        System.Type.GetTypeFromHandle
IL_0014:  call        System.Type.op_Equality
我们看不到该方法在中的作用,因为它显然是一个外部方法,但我猜它要么调用该方法,要么在本机代码中执行类似的比较。

typeof()
操作符解析为
System.Type
,而
系统上的
==
运算符。键入
检查引用相等性。这对于
系统来说已经足够了。键入
,因为有此保证:

表示类型的类型对象是唯一的;也就是说,当且仅当两个类型对象引用表示同一类型时,它们才会引用同一对象。这允许使用引用相等来比较类型对象

答案是,==检查这两种类型是否引用了内存中完全相同的对象,如果原始对象的类型相同,则由于上面的引用,它们的类型保证引用了内存中的相同对象。

操作符
typeof()
解析为
System.type
,而
系统上的
==
运算符。键入
检查引用相等性。这对于
系统来说已经足够了。键入
,因为有此保证:

表示类型的类型对象是唯一的;也就是说,当且仅当两个类型对象引用表示同一类型时,它们才会引用同一对象。这允许使用引用相等来比较类型对象


答案是,==检查这两种类型是否引用了内存中完全相同的对象,如果原始对象属于相同的类型,则由于上面的引用,它们的类型保证引用了内存中的相同对象。

为什么您认为在比较之前必须将对象转换为字符串?你可能想考虑<代码>等于方法和<代码>等式< /代码>运算符,实现.<代码> int >代码>仅仅是<代码> St.INT32 < /代码>的别名。为什么你认为事物在被比较之前必须转换为字符串?您可能需要考虑<代码>等于方法和<代码>等式< /代码>运算符,实现.<代码> int >代码>只是“<代码> St.INT32 < /代码>的别名。不是每个类。关键是如果类不重写
相等
-运算符,您将得到引用相等检查,这通常不是您想要的。好的,我认为它使用了
对象。相等
,这将归结为
类型。相等
@TimSchmelter:我根据您的评论更新了我的答案。谢谢。@PatrickHofman所以你说的是System.Type最终被调用,如果Type是相同的,它将返回true,false,否则“像其他所有类一样”?不是每个类。关键是如果类不重写
相等
-运算符,您将得到引用相等检查,这通常不是您想要的。好的,我认为它使用了
对象。相等
,这将归结为
类型。相等
@TimSchmelter:我根据您的评论更新了我的答案。谢谢。@PatrickHofman所以你说的是System.Type最终被调用,如果Type相同,则返回true,否则返回false