== Equals ReferenceEquals 比较
== 为操作符
ReferenceEquals和Equals为函数
=========================================================
ReferenceEquals用于比较引用类型的引用是是否指向同一个对象。它只能比较引用类型。当把值类型传给它的时候永远都会返回false,因为值类型作为参数的时候首先会装箱,经过装箱的值类型哪怕是指相等,但是也是两个不同的对象,所以变量是指向不同的对象,所以永远返回false。
例如:
int x = ;
int y = ;
bool b1 = object.ReferenceEquals(x,y);
结果肯定是返回false,但是如果是比较引用类型,如果是两个引用指向同一个对象,则为true。
再例如:
public class Person
{
public string PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Program
{ static void Main(string[] args)
{
Person person1 = new Person {PersonId = "", FirstName = "Qu", LastName = "Geng"};
Person person2 = new Person { PersonId = "", FirstName = "Qu2", LastName = "Geng2" };
Person person3 = person2;
bool br1 = object.ReferenceEquals(person1, person2);
bool br2 = object.ReferenceEquals(person2, person3);
Console.WriteLine(br1);
Console.WriteLine(br2);
Console.ReadKey();
}
}

我们可以发现第一个返回false,第二个返回true。那么如果其中有一个对象为null,或者两个对象都为null呢?结果会为false,如果两个都为null呢?结果为true。他们不会引发异常。
Equals
实例Equals算是比较复杂的一个比较方法。实例Equals可以比较引用是否指向同一个对象,同时可以按值来比较对象。如果要按值比较对象,我们就需要重载Equals对象来实现我们的比较逻辑。同时Equals默认也支持比较值类型的相等。那么我们该怎么重载Equals来让对象具有值相等性的比较呢?
它返回true有三种情况:
1,引用指向同一个对象
2,比较两个null
3,重载了Equals的实例方法返回true
==运算符
==号运算符其实跟实例的Equals没有多大的区别,==是运算符,而Equals是方法。他们都可以重写。默认都能比较引用和比较值。关于==的重载可以参考运算符一文中的运算符重载。
总结他们的区别:
ReferenceEquals:静态方法,不能重写,只能比较引用,如果有一个参数为null会返回false,不会抛出异常,如果比较值类型,则始终返回false。
Equals:实例方法,默认可以比较引用也可以比较值,可以重写。可以按值比较对象。
静态Equals:静态方法,不能重写。如果没有重写Equals,比较引用,或者比较值。如果重载了Equals方法。比较引用,或者比较值,或者按重写的Equals比较,如果其中一个参数为null,抛出异常
==运算符:可以按引用比较,也可以按值比较。可以重写。是操作运算符。
最后需要的是,如果重载了Equals,则最好是重载GetHashCode,必须重载==运算符。
== Equals ReferenceEquals 比较的更多相关文章
- C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?
1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又 ...
- 【转载】C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?
1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又 ...
- C#中==、Equals、ReferenceEquals的区别
原文链接:http://www.studyofnet.com/news/1188.html 本文导读: C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不 ...
- C#中 Reference Equals, == , Equals的区别
原文地址:http://blog.csdn.net/wuchen_net/archive/2010/03/23/5409327.aspx ReferenceEquals, == , Equals Eq ...
- 论C#未来发展
近日M#的消息令江湖再次起了波澜.大家知道,.NET已经进入了瓶颈期.这个消息又让偶有所期待,趁此机会发表一下个人的展望,对C#或者其继任者,不管是M#还是X#. 一.语法特性 1. using引入类 ...
- C#中的==、Equal、ReferenceEqual(转载)
1. ReferenceEquals, == , Equals Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等. a) ReferenceEquals ...
- .NET工作准备--02基础知识
(已过时) 框架基础,语法基础,字符串&集合&流,常见类和接口; 02.net基础(重点) -第一部分 框架基础 1.基础概念 CTS(Common Type System),CLS( ...
- 【转载】C#中的==、Equal、ReferenceEqual
1. ReferenceEquals, == , Equals Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等. a) ReferenceEquals ...
- 【转】C#中的==、Equal、ReferenceEqual
[转]C#中的==.Equal.ReferenceEqual 转载自: http://www.cnblogs.com/zagelover/articles/2741409.html 1. Refere ...
随机推荐
- C#练习委托、事件、事件处理
控制台应用程序效果: 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- dos与unix文件格式之间的转换
1. VI编辑器中转换 在VI中使用命令 set ff?(fileformat)可以查看文件的格式,使用set ff=dos(unix)可以设置文件的格式 2.使用sed处理(来至http://www ...
- 关于树莓派Pi2通过UART连接攀藤G5传感器的python
1.准备工作:树莓派Pi2板子,攀藤G5传感器 关于树莓派40pin口网上很多,我们只了解与攀藤G5连接的问题 (1)攀藤G5pin1(VCC5v)要注意是5V,有很多板子接的是3V,而树莓派的pin ...
- [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- nginx 搭建虚拟主机
一.排错三部曲 第一步在客户端上ping服务端ip ping 10.0.0.8 第二部在客户端上telnet服务器端IP.端口 telnet 10.0.0.8 第三部在客户端使用wget命令检测 ...
- JavaWeb -- Session应用实例 -- 随机中文验证码 检验
注册页面 login.html <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html ...
- GeoServer基础教程(三):部署发布Shapefile地图数据
转载:http://blog.csdn.net/mingzai624. 这是GeoServer官方网站提供的一份Shapefile测试数据 nyc_roads.zip ,包含了部分纽约的道路信息,我们 ...
- sublime text _注册码
转自:https://9iphp.com/web/html/sublime-text-3-license-key.html 使用方法 打开 Sublime Text 3 的 “Help”–“Enter ...
- perl: warning: Falling back to the standard locale ("C").
/********************************************************************************** * perl: warning: ...
- OpenCV - Android Studio 中集成Opencv环境(不包含opencv_contrib部分)
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,支持的运行环境也是非常的多,这篇文章主要讲的是Android环境集成OpenCV(IDE是Android Studio,我想Eclip ...