比较对象的相等性

需要理解对象相等的机制对逻辑表达式的编程很重要,另外,对实现运算符重载和类型强制转换也很重要.

对象相等的机制有所不同,这取决于比较的是引用类型还是值类型.

比较引用类型的相等性

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#编程(三十九)----------比较对象的相等性的更多相关文章

  1. centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课

    centos shell编程5  LANMP一键安装脚本 lamp  sed  lnmp  变量和字符串比较不能用-eq  cat > /usr/local/apache2/htdocs/ind ...

  2. NeHe OpenGL教程 第三十九课:物理模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  4. Gradle 1.12用户指南翻译——第三十九章. IDEA 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  5. 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

  6. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  7. 《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)

    1.简介 在做web自动化时,有些情况selenium的api无法完成,需要通过第三方手段比如js来完成实现,比如去改变某些元素对象的属性或者进行一些特殊的操作,本文将来讲解怎样来调用JavaScri ...

  8. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  9. “全栈2019”Java第三十九章:构造函数、构造方法、构造器

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. 微信小程序把玩(三十九)navigation API

    原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...

随机推荐

  1. Project Euler Problem1

    Multiples of 3 and 5 Problem 1 If we list all the natural numbers below 10 that are multiples of 3 o ...

  2. vue 数组

    今天项目中发现的一个问题: 在vue项目中输出一个数组,明明有俩个值:0,6,但是length为1 正常的是这样的 结果研究发现,是vue源码的问题,具体内容如下: 转载自:http://www.cn ...

  3. tensorflow 使用预训练好的模型的一部分参数

    vars = tf.global_variables() net_var = [var for var in vars if 'bi-lstm_secondLayer' not in var.name ...

  4. LeetCode(22):括号生成

    Medium! 题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", ...

  5. SOA 设计的 9 大原则

    面向服务的架构 (SOA) 设计要尽可能地简单.在设计一个 SOA 服务的时候要谨记这 9 大设计原则: 1. 标准服务契约 服务要遵循一个服务描述. 2. 松耦合 服务之间的依赖最小化. 3. 服务 ...

  6. oracle中 connect by prior 递归查询

    Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename sta ...

  7. 扩展BootstrapTable的treegrid功能

    扩展BootstrapTable的treegrid功能 阅读目录 一.效果预览 二.代码示例 三.组件需要完善的地方 四.总结 正文 前言:上篇  JS组件系列——自己动手封装bootstrap-tr ...

  8. 【LOJ】#2082. 「JSOI2016」炸弹攻击 2

    题解 想到n3发现思路有点卡住了 对于每个发射塔把激光塔和敌人按照极角排序,对于一个激光塔,和它转角不超过pi的激光塔中间夹的敌人总和就是答案 记录前缀和,用two-Points扫一下就行 代码 #i ...

  9. 【Java】 大话数据结构(17) 排序算法(4) (归并排序)

    本文根据<大话数据结构>一书,实现了Java版的归并排序. 更多:数据结构与算法合集 基本概念 归并排序:将n个记录的序列看出n个有序的子序列,每个子序列长度为1,然后不断两两排序归并,直 ...

  10. django 使用 request 获取浏览器发送的参数

    django 使用 request 获取浏览器发送的参数     转载请注明出处 https://blog.csdn.net/fanlei5458/article/details/80638348 获 ...