繁体   English   中英

==运算符如何与System.Type一起使用

[英]How == operator works with System.Type

typeof(int) == typeof(int)

此表达式如何计算?

当我使用

Console.WriteLine(typeof(int));

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

 typeof(int) == typeof(int)

ToString()将其都转换为System.Int32 ,然后将其字符串进行比较。 真的吗 ??

或其他事情正在发生

否。像其他所有类通常一样,它使用相等比较器( ==System.Type被覆盖,并且对两个实例之一检查Equals方法是否相等。

typeof(int)返回Type ,因此调用Type.Equals 您可以在此处查看源代码。

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

return (Object.ReferenceEquals(this.UnderlyingSystemType, o.UnderlyingSystemType));

所述typeof()算子解析为一个System.Type ,并且==上操作者System.Type 检查引用相等 这对于System.Type就足够了,因为有以下保证:

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

http://msdn.microsoft.com/en-us/library/42892f65.aspx

所以答案是,==检查两种类型是否都指向内存中完全相同的对象,并且如果原始对象属于同一类型,则由于上面的引用,可以保证它们的类型都指向内存中的相同对象。 。

typeof(int) == typeof(int)的IL代码为

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

您可以看到它调用了静态相等运算符

public static bool operator ==(Type left, Type right)

我们无法在参考源中看到此方法的作用,因为它显然是外部方法,但我猜是它要么调用Equals方法,要么在本机代码中执行类似的比较。

Console.WriteLine(object);的事实Console.WriteLine(object); 打印出一个string并不意味着Type类型总是一个字符串,类似于您可以打印出一个int值而无需通过其ToString方法查看和比较该int方式。

==运算符将测试类型的相等性,并且绝不涉及ToString()

我想您可能有点困惑-如果我不得不猜测-在打印某些内容和将其保存在内存之间的区别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM