分析.NET中的 ==操作符 和 Equal()方法

分析来源:微软开放的 .NET4.5.1 源码 和MSDN

一、在String类中

1、String重载了==操作符

简单说就是:若返回true,就是确保字符串内容是一致的。(要么内容一致,要么就是同一个字符串对象)

 1 public static bool operator ==(String a, String b) 
 2 {
 3     return String.Equals(a, b);
 4 }
 5 
 6 
 7 public static bool Equals(String a, String b)
 8 {
 9     if ((Object)a == (Object)b)//如果两个引用相等(指向同一个对象),内容当然相等
10     {
11         return true;
12     }
13 
14     if ((Object)a == null || (Object)b == null)
15     {
16         return false;
17     }
18 
19     if (a.Length != b.Length)
20         return false;
21 
22     return EqualsHelper(a, b);//比较字符串内容,具体代码不贴了
23 }

2、String重写override了Object.Equal()方法

简单说就是:若返回true,就是确保字符串内容是一致的。(要么内容一致,要么就是同一个字符串对象)

 1 public override bool Equals(Object obj)
 2 {
 3     if (this == null)                        
 4         throw new NullReferenceException();  
 5 
 6     String str = obj as String;
 7     if (str == null)
 8         return false;
 9 
10     if (Object.ReferenceEquals(this, obj))//实际上比较两个引用。详见下一节的Object.ReferenceEquals()源码。
11         return true;
12 
13     if (this.Length != str.Length)
14         return false;
15 
16     return EqualsHelper(this, str);//比较字符串内容,具体代码不贴了
17 }

 

 

二、在Object类中

1、 Object.operator ==(Object objectA, Object objectB)

源码没有找到。

查询MSDN关于==操作符章节得知:

(1)对于预定义的值类型,如果其操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。

  .NET预定义值类型,微软就是这么实现的。直接比较值内容。

(2)对于 string 外的引用类型,如果两个操作数引用同一对象,则 == 会返回 true。

  比较引用

(3)对于 string 类型,== 会逐字比较字符串的内容。

  因为上面说过了,String中重载了==操作符。

注意:用户定义的值类型可以重载 == 运算符。 用户定义的引用类型情况也相似,但是默认情况下,== 的行为如上述预定义和用户定义的引用类型所述。 如果已重载 ==,则必须同时重载 !=。 对整数类型的操作通常可用于枚举。

 

2、Object.Equal()

 1 public virtual bool Equals(Object obj)//虚方法默认CLR根据对象类型再决定怎么对比,子类可重写
 2 {
 3     return RuntimeHelpers.Equals(this, obj);//
 4 }
 5 
 6 public static bool Equals(Object objA, Object objB)
 7 {//
 8     if (objA == objB)
 9     {
10         return true;
11     }
12     if (objA == null || objB == null)
13     {
14         return false;
15     }
16     return objA.Equals(objB);//调用上面的虚方法
17 }
18 
19 public static bool ReferenceEquals(Object objA, Object objB)
20 {//
21     return objA == objB;//比较两个引用是否相同
22 }

 

虚方法 virtual bool Equals(Object obj)

根据对象Type判断比较引用还是比较值,怎么获取对象是引用类型和值类型?这个判断由谁实现?即RuntimeHelpers.Equals(this, obj); 由CLR自行判断,那么到底怎么判断呢,反射!Type中有一个方法是 Type.IsValueType(object obj),即可判断一个Object是值类型还是引用类型,引用类型则调用Object.Equals(),值类型则调用ValueType.Equals()。

 

posted on 2018-03-14 18:00  困兽斗  阅读(714)  评论(0)    收藏  举报

导航