1.当你创建你自己的类型时(不管是类还是结构),你要定义类型在什么情况下是相等的。C#提供了4个不同的方法来断定两个对象是否是相等的

public static bool ReferenceEquals ( object left, object right ); 
public static bool Equals ( object left, object right );
public virtual bool Equals( object right);
public static bool operator==( MyClass left, MyClass right );

2.从两个你可能从来不会修改的方法.

Object.ReferenceEquals()在两个变量引用到同一个对象时返回true。不管比较的是引用类型还是值类型的方法总是检测对象引用而不是内容。这就是说当测试两个值类型是否相等时,ReferenceEquals()总返回false,即使比较同一个值类型对象。原因是:这里有两个装箱 (译注:因为参数要求两个引用对象,所以用两个值类型来调用该方法,会先使两个参数都装箱,这样一来,两个引用 对象自然就不相等了。)

Object.Equals()方法在你不清楚两个参数的运行类型时什么时,检测它们是否相等。它的实现代码如下

public static bool Equals( object left, object right )
{
// Check object identity
if (left == right ) return true;
// both null references handled above
if ((left == null) || (right == null))
return false;
return left.Equals (right);
}
静态的Equals()是使用左边参数实例的Equals()方法来断定两个对象是否相等

3.实例的Object.Equals()函数--默认行为与Object.ReferenceEquals()是一样的,但是值类型是不一样的

static void Main(string[] args)
{
int i = ;
int j = ;
Console.WriteLine(i.Equals(j).ToString());//true 两个值类型的变量相等,如果它们的类型和内容都是一样的。
double j = 5;
Console.WriteLine(i.Equals(j).ToString());//false
Console.ReadKey();
 }

你应该在什么时候来重写它:创建一个值类型时,总是重写实例的Equals()函数。说白了就是如果你的类型须要遵从值类型的语义(比较内容)而不是引用类型的语义(比较对象ID)时,你应该自己重写实例的Object.Equals()方法

如何做?未看明白。。。。

EffectiveC#9--明白几个相等运算之间的关系的更多相关文章

  1. 电脑结构和CPU、内存、硬盘三者之间的关系

    前面提到了,电脑之父——冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器. 我们看一下现在我们电脑的: 键盘鼠标.显示器.机箱.音响等等. 这里显示器为比较老的CRT显示器 ...

  2. 网络互联技术(2)——前篇—【转载】电脑结构和CPU、内存、硬盘三者之间的关系

    原文链接:传送门 详细内容: 电脑结构和CPU.内存.硬盘三者之间的关系 前面提到了,电脑之父——冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器. 我们看一下现在我们电脑 ...

  3. 浅谈CPU、内存、硬盘之间的关系

    计算机,大家都知道的,就是我们日常用的电脑,不管台式的还是笔记本都是计算机.那么这个看着很复杂的机器由哪些组成的呢,今天就简单的来了解一下. 先放图: 图上展示的就是计算机的基本组成啦. 首先是输入设 ...

  4. linux图形界面基本知识(X、X11、Xfree86、Xorg、GNOME、KDE之间的关系)

    linux图形界面基本知识(X.X11.Xfree86.Xorg.GNOME.KDE之间的关系)(转自互联网) LINUX初学者经常分不清楚linux和X之间,X和Xfree86之间,X和KDE,GN ...

  5. 转载:Linux图形界面知识(介绍X、X11、GNOME、Xorg、KDE等之间的关系)

    转载 http://blog.csdn.net/zhangxinrun/article/details/7332049Linux初学者经常分不清楚linux和X之间,X和Xfree86之间,X和KDE ...

  6. .NET Core与.NET Framework、Mono之间的关系

    随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...

  7. [转] valuestack,stackContext,ActionContext.之间的关系

    三者之间的关系如下图所示: ActionContext  一次Action调用都会创建一个ActionContext  调用:ActionContext context = ActionContext ...

  8. angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。

    最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ...

  9. 谈谈Activiti中流程对象之间的关系

    详细见:http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html (咖啡兔好牛!) 详细见: http://blo ...

随机推荐

  1. scala中的implict

    1.作为隐式参数 object Test { def main(args: Array[String]) { import FruitColor._ Fruit.get("apple&quo ...

  2. Linq中的多表左联,详细语句

    from m in context.WX_MemberCollectDish join d in context.Dish on m.DishID equals d.DishID into temp ...

  3. IE兼容性标签和条件注释

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. (转+原)python中的浅拷贝和深拷贝

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...

  5. dwz笔记之tree权限扩展

    碰到的问题:tree选择子节点时,父级节点的值没有选择 解决方法如下(红色部分): 原代码: _checkParent:function(){ if($(this).parent().hasClass ...

  6. 移动web开发中遇到的一些问题收纳

    1.获取滚动条的值: window.scrollY window.scrollX 桌面浏览器中想要获取滚动条的值是通过document.scrollTop和document.scrollLeft得到的 ...

  7. Meta 整合

    Meta 整合:http://segmentfault.com/a/1190000002407912

  8. [FML]学习笔记一Cross-validation交叉验证

    在实际的工程中,有时labeled data的数量不足以留出validation sample(验证样本)否则会导致training sample(训练样本)的数量太少.为了解决这个问题,我们引入一种 ...

  9. 利用程序将.jrxml导出为.jasper文件并用PDF显示(2)

    直接在Web项目中使用.jasper文件,其实在软件项目开发时,.jrxml文件经常修改,而且.jrxml还要在项目中进行保留备份,所以较为流行的做法是在项目中使用.jrxml来生成.jasper文件 ...

  10. uva1368 DNA Consensus String

    <tex2html_verbatim_mark> Figure 1. DNA (Deoxyribonucleic Acid) is the molecule which contains ...