C#高级编程三十九天----比较对象的相等性
2015-07-15 21:35
120 查看
比较对象的相等性
需要理解对象相等的机制对逻辑表达式的编程很重要,另外,对实现运算符重载和类型强制转换也很重要.
对象相等的机制有所不同,这取决于比较的是引用类型还是值类型.
比较引用类型的相等性
System.Object定义了三个不同的方法来比较对象的相等性:ReferenceEquals()和Equals()两个版本,再加上比较运算符,实际上有四种进行相等比较的方式.
1.ReferenceEquals()方法
以下是ReferenceEquals()方法的定义
public static bool ReferenceEquals(object objA, object objB)
ReferenceEquals()是一个静态方法,测试两个引用是够引用类的同一个实例,特别是两个引用是否包含内存中的相同地址.作为静态方法,他不能重写,所以System.Object的实现代码保持不变.如果提供的两个引用引用同一个对象实例,则ReferenceEquals()总是返回true;否则就返回false.但是它默认 null等于null;
案例:
SomeClass x,y;
x=new SomeClass();
y=SomeClass();
bool b1=ReferenceEquals(null,null) //返回真
bool b2=ReferenceEquals(null,x) //返回假
bool b3=ReferenceEquals(x,y) //返回假,因为x和y指向不同的对象
2.虚拟的Equals()方法
以下是Equals()方法的定义:
public virtual bool Equals(object obj)
返回一个值,该值指示当前的object是否等于当前的object.
Equals的默认实现仅支持引用相等,但派生类可重写此方法一直吃值相等.
在下面的列表中,x,y,z表示不为空的引用:
(1)除设计浮点型的情况外,x.Equals(x)都返回true
(2)x.Equals(y)返回与y.Equals(x)相同的值
(3)如果x和y都为NaN,则x.Equals(y)返回true.
(4)当且仅当x.Equals(z)返回true时,(x.Equals(y)&&y.Equals(z))才返回相同的值
(5)只要不修改x和y引用的对象,对x.Equals(y)的相机调用将返回相同的值
(6)x.Equals(null)返回false
案例:
public class Sample
{
public void Method()
{
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj1.Equals(obj2));//返回假
obj2 = obj1;
Console.WriteLine(obj1.Equals(obj2));//返回真
Console.ReadKey();
}
}
3.静态的Equals()方法
以下是静态的Equals()方法的定义
public static bool Equals(object objA , object objB)
如果objA是与objB相同的实例,或者如果两者均为空引用,或者如果objA.Equals(objB)返回true,则为true ,否则为false.
值类型的相等比较
在进行值类型的相等比较的时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()用于比较值.最大的区别是,值类型需要装箱才能把他们转换为引用,才能对他们执行方法.
ReferenceEquals()在应用值类型时,总是返回false,因为为了调用这个方法,值类型需要装箱到对象中.即使使用下面的代码:
int v = 10;
bool b = ReferenceEquals(v, v);
Console.WriteLine(b);//b返回false
因为在转换每个参数时,v都睡被单独装箱.
需要理解对象相等的机制对逻辑表达式的编程很重要,另外,对实现运算符重载和类型强制转换也很重要.
对象相等的机制有所不同,这取决于比较的是引用类型还是值类型.
比较引用类型的相等性
System.Object定义了三个不同的方法来比较对象的相等性:ReferenceEquals()和Equals()两个版本,再加上比较运算符,实际上有四种进行相等比较的方式.
1.ReferenceEquals()方法
以下是ReferenceEquals()方法的定义
public static bool ReferenceEquals(object objA, object objB)
ReferenceEquals()是一个静态方法,测试两个引用是够引用类的同一个实例,特别是两个引用是否包含内存中的相同地址.作为静态方法,他不能重写,所以System.Object的实现代码保持不变.如果提供的两个引用引用同一个对象实例,则ReferenceEquals()总是返回true;否则就返回false.但是它默认 null等于null;
案例:
SomeClass x,y;
x=new SomeClass();
y=SomeClass();
bool b1=ReferenceEquals(null,null) //返回真
bool b2=ReferenceEquals(null,x) //返回假
bool b3=ReferenceEquals(x,y) //返回假,因为x和y指向不同的对象
2.虚拟的Equals()方法
以下是Equals()方法的定义:
public virtual bool Equals(object obj)
返回一个值,该值指示当前的object是否等于当前的object.
Equals的默认实现仅支持引用相等,但派生类可重写此方法一直吃值相等.
在下面的列表中,x,y,z表示不为空的引用:
(1)除设计浮点型的情况外,x.Equals(x)都返回true
(2)x.Equals(y)返回与y.Equals(x)相同的值
(3)如果x和y都为NaN,则x.Equals(y)返回true.
(4)当且仅当x.Equals(z)返回true时,(x.Equals(y)&&y.Equals(z))才返回相同的值
(5)只要不修改x和y引用的对象,对x.Equals(y)的相机调用将返回相同的值
(6)x.Equals(null)返回false
案例:
public class Sample
{
public void Method()
{
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj1.Equals(obj2));//返回假
obj2 = obj1;
Console.WriteLine(obj1.Equals(obj2));//返回真
Console.ReadKey();
}
}
3.静态的Equals()方法
以下是静态的Equals()方法的定义
public static bool Equals(object objA , object objB)
如果objA是与objB相同的实例,或者如果两者均为空引用,或者如果objA.Equals(objB)返回true,则为true ,否则为false.
值类型的相等比较
在进行值类型的相等比较的时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用,Equals()用于比较值.最大的区别是,值类型需要装箱才能把他们转换为引用,才能对他们执行方法.
ReferenceEquals()在应用值类型时,总是返回false,因为为了调用这个方法,值类型需要装箱到对象中.即使使用下面的代码:
int v = 10;
bool b = ReferenceEquals(v, v);
Console.WriteLine(b);//b返回false
因为在转换每个参数时,v都睡被单独装箱.
相关文章推荐
- 读改善c#代码157个建议:建议4~6
- c#调用TeamViewer或AnyDesk实现远程控制
- C#实现多线程的Web代理服务器实例
- C#注册机与绑定软件(转发自:韩兆新的博客园的C#学习笔记——软件注册与注册机)
- c# 获取客户端ip、mac、机器名、操作系统、浏览器信息
- C#非递归先序遍历二叉树实例
- 转-C#让枚举返回字符串
- C# winform 导出pdf报表
- C# 鼠标全局钩子
- C#创建自签名认证文件的方法
- C#发送数据到剪贴板及从剪贴板中取数据的方法
- C#访问修饰符
- C# 学习笔记
- C# 结构体访问器错误提示
- C#实现Zip压缩目录中所有文件的方法
- C#简单实现SNMP的方法
- 在C#中实现Word页眉页脚的所有功能
- C# 批处理制作静默安装程序包
- C#使用CDO发送邮件的方法
- C# 判断文件的真实格式