== 为操作符

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 比较的更多相关文章

  1. C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?

    1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又 ...

  2. 【转载】C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?

    1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又 ...

  3. C#中==、Equals、ReferenceEquals的区别

    原文链接:http://www.studyofnet.com/news/1188.html 本文导读: C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不 ...

  4. C#中 Reference Equals, == , Equals的区别

    原文地址:http://blog.csdn.net/wuchen_net/archive/2010/03/23/5409327.aspx ReferenceEquals, == , Equals Eq ...

  5. 论C#未来发展

    近日M#的消息令江湖再次起了波澜.大家知道,.NET已经进入了瓶颈期.这个消息又让偶有所期待,趁此机会发表一下个人的展望,对C#或者其继任者,不管是M#还是X#. 一.语法特性 1. using引入类 ...

  6. C#中的==、Equal、ReferenceEqual(转载)

    1. ReferenceEquals, == , Equals Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等. a) ReferenceEquals ...

  7. .NET工作准备--02基础知识

    (已过时) 框架基础,语法基础,字符串&集合&流,常见类和接口; 02.net基础(重点) -第一部分 框架基础 1.基础概念 CTS(Common Type System),CLS( ...

  8. 【转载】C#中的==、Equal、ReferenceEqual

    1. ReferenceEquals, == , Equals Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等. a) ReferenceEquals ...

  9. 【转】C#中的==、Equal、ReferenceEqual

    [转]C#中的==.Equal.ReferenceEqual 转载自: http://www.cnblogs.com/zagelover/articles/2741409.html 1. Refere ...

随机推荐

  1. Java 线程的终止-interrupt

    Java线程的终止——interrupt 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种 ...

  2. IOS 判断当前UIViewController 是否正在显示

    我通常的做法是根据视图控制器的生命周期来判断,其是否是正在使用的状态. 举例 设一个实例布尔变量isVisible  在 -ViewWillAppear 里面 isVisible = YES ;  在 ...

  3. 【leetcode刷题笔记】Spiral Matrix

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  4. <开源项目分析>Cisco的开源视频加解码器THOR(H.264解码)

    原创博客,转载请联系博主! 题外话:自学了快两个月的Perl语言,本来打算写两篇基础介绍的博文来科普一下一些小技巧,但是仔细想想还是没有必要了吧,毕竟现在无论是在用Perl5还是Perl6的人都是小众 ...

  5. 算法(Algorithms)第4版 练习 1.5.13

    package com.qiusongde; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; pu ...

  6. Python基础-set集合操作

    set集合,是一个无序且不重复的元素集合.定义方式类似字典使用{}创建 目前我们学过的数据类型: 1.字符串(str),2.整型(int),3.浮点型(float),4,列表(list) 5.元组(t ...

  7. Linux vi/vim使用方法

    vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令. 1.vi的基本概念 基本上vi ...

  8. Python基础-redis模块使用

    redis是一个数据库,他的数据全都是存放在内存里面的,redis每秒能支持30w次的读写,存放有两种格式,一种string类型,一种是hash类型 一,操作string类型 r=redis.Redi ...

  9. rust ownership 系统

    ### 对象销毁规则 未被使用的函数返回值 被let绑定的值, 在函数末尾销毁,除非被moved ``` let v = obj::new("a"); other_fun(v); ...

  10. Python语言及其应用 第2章