分析.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()。
浙公网安备 33010602011771号