Net复习笔记:第八部分:对象判等
对象判等主要包含了四种方法
1. public virtual bool Equals(object obj) 虚方法比较对象实例是否相等
2.public static bool Equals(object objA,object objB) 静态方法比较对象实例是否相等
3. public static bool ReferenceEquals(object objA,object objB) 静态方法比较两个引用是否相等
4.==比较对象实例是否相等
判等解析
- 1. 静态方法Equals(object objA,object objB)的判等
- public static bool Equals(object objA, object objB)
- {
- return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
- }
根据net的实现代码我们可以看到,静态方法的判等主要和三个方面有关系,第一个是,是否是同一个实例,第二个是,是否是都为空,第三个是,第一个参数的Equals虚方法
namespace NetNiBiXiuZhiDao
{
public partial class WebForm14 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
MyclassA mya = new MyclassA();
MyClassB myb = new MyClassB();
Response.Write(Equals(mya, myb)) //输º?出?的Ì?为true;
Response.Write(Equals(myb, mya)) //输º?出?的Ì?为false;
}
}
class MyclassA
{
public override bool Equals(object obj)
{
return true;
}
}
class MyClassB
{
public override bool Equals(object obj)
{
return false;
}
}
}
2.ReferenceEquals方式判等
net中referenceEquals的实现代码为
public static bool ReferenceEquals(object objA, object objB)
{
return (objA == objB);
}
Response.Write(ReferenceEquals(1,1));输出的为false,因为ReferenceEquals只能比较引用类型,所以值类型用ReferenceEquals必然发生拆箱和装箱,所以内存地址肯定不同
但是 string Stra = "ABC";
string Strb = "ABC";
Response.Write(ReferenceEquals(Stra, Strb));返回的为true
看以看出stra和strb不但内容相同还有相同的引用地址,这个是因为string的字符串驻留机制
3.Equals虚方法方式判等
Net中Equals的实现代码为
public bool Equals(string value)
{
if (this == null)
{
throw new NullReferenceException();
}
if (value == null)
{
return false;
}
return (object.ReferenceEquals(this, value) || EqualsHelper(this, value));
}
我们可以看出:1.如果是null使用虚方法Equals就会报错,2.如果是比较的值是null哪肯定是false,3.用于比较的两个值,如果是引用类型就比较那个比较对象的引用地址,如果是值类型就比较他们的值
在对象的判等中,ReferenceEquals是只能判断引用类型(也可以判等string类型),而Equals和==是对象是值类型的时候比较的是两个对象的值,对象是引用类型的时候比较的是对象的引用