C# == 和 Equals
先看一下解释
msdn对于
== 的解释:
对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。 对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。 对于 string 类型,== 比较字符串的值。
equals的解释:
如果当前实例是引用类型,Equals(Object)方法测试引用相等性,并调用Equals(Object)方法等效于调用ReferenceEquals方法。 引用相等性意味着进行比较的对象变量引用同一个对象
如果当前实例是值类型,Equals(Object)方法测试值是否相等
好像很明白了,但是下面存在一个问题,我也只是主观猜测
static void Main(string[] args)
{
int t1 = 10;
int t2 = 10;
Console.WriteLine(t1 == t2); //True
Console.WriteLine(t1.Equals(t2)); //True
object a1 = 15;
object a2 = 15;
Console.WriteLine(a1 == a2); //False
Console.WriteLine(a1.Equals(a2)); //True
object b1 = new StringBuilder("a");
object b2 = new StringBuilder("a");
object b3 = b1;
Console.WriteLine(b1==b2); //False
Console.WriteLine(b1.Equals(b2)); //False
Console.WriteLine(b3 == b1); //True
Console.WriteLine(b3.Equals(b1)); //True
Console.ReadLine();
}
分段讨论
可以看到
1
int t1 = 10;
int t2 = 10;
Console.WriteLine(t1 == t2); //True
Console.WriteLine(t1.Equals(t2)); //True
值类型的关系,无论==还是Equals,比较方式相同,都是比较值。
返回2个true,毫无悬念
2(问题在这里,了解的朋友可以详细的说一下,本人只是猜测)
object a1 = 15;
object a2 = 15;
Console.WriteLine(a1 == a2); //False
Console.WriteLine(a1.Equals(a2)); //True
这个比较容易让人难以理解。
其实很简单,我们看一下地址就知道了。
可以看到,地址不一样。
我没有详细研究原因,但是==可能比较了地址,而equals比较了值。
3
object b1 = new StringBuilder("a");
object b2 = new StringBuilder("a");
object b3 = b1;
Console.WriteLine(b1==b2); //False
Console.WriteLine(b1.Equals(b2)); //False
Console.WriteLine(b3 == b1); //True
Console.WriteLine(b3.Equals(b1)); //True
可以看到,地址不同肯定就不同了。
总结:
Equals 是虚函数,可以在所有类型里面重写,这样即使调用的是 object 的 Equals,实际上调用的是 object 的具体对象的 Equals
C# == 和 Equals的更多相关文章
- equals变量在前面或者在后面有什么区别吗?这是一个坑点
我就不废话那么多,直接上代码: package sf.com.mainTest; public class Test { public static void main(String[] args) ...
- How to implement equals() and hashCode() methods in Java[reproduced]
Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...
- 【特种兵系列】String中的==和equals()
1. 小样示例 public static void main(String[] args) { String a = "a" + "b" + 123; Str ...
- (转)浅谈Java中的equals和==
原文地址: http://www.cnblogs.com/dolphin0520/p/3592500.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new S ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- List<T>Find方法,FindAll方法,Contains方法,Equals方法
假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...
- 让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较
重构背景及原因 最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势.考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提 ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- Equals和ReferenceEquals
稍微分析下一下两个方法的区别: public static bool Equals(object objA, object objB); public static bool ReferenceEqu ...
- 【原创】Java和C#下String类型中的==和equals的原理与区别
一.Java下 1.几个例子 public static void main(String[] arge) { String str1 = new String("1234"); ...
随机推荐
- sql 语言
sql 语言 DDL DDL 全称 Data Definition Language,即数据定义语言. DATABASE 创建数据库 CREATE DATABASE 语句用于创建数据库. CREATE ...
- Linux java 命令行编译 jar包
Java 命令行编译成class,然后在打包成jar文件. 编译成class javac -classpath $CLASS_PATH -d class ./src/Hello.java 可以通过ja ...
- NOIP2002-2017普及组题解
虽然普及组一般都是暴力省一,但是有一些题目还是挺难的qwq个人觉得能进TG的题目会在前面打上'*' NOIP2002(clear) #include<bits/stdc++.h> usin ...
- React-组件 & Props
React元素可以只是DOM标签 const element = <div />; React元素也可以是用户自定义的组件: const element = <Welcome nam ...
- Log4j使用笔记
在工作过程中,常常需要查看后台日志,为了更好的记录日志,我们使用Log4j来记录日志. 一.maven依赖的配置 在maven中央库库里找到log4j的java包,添加 ...
- Linux tar 解压 压缩(转)
注:tar是打包,不是压缩!) 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName .tar.gz 解压:tar zxvf FileN ...
- jdk8+Mybatis3.5.0+Mysql读取LongBlob失败
问题:在mysql中存储base64,因为太长,基本就是几百K,所以用longBlob 描述:在mysql中,LongBlob.blob算是二进制流文件了,所以用普通的数据格式是不行的,这里用Type ...
- Luogu P3768 简单的数学题
非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_ ...
- supervisord监控服务必备命令
supervisord(http://supervisord.org/introduction.html)是一个非常优秀的进程管理工具,使用Python开发.它可以在类UNIX系统的方式让用户来准确地 ...
- 虚拟机console基础环境配置——系统镜像站点配置
1. 概述2. 部署HTTP服务器2.1 YUM安装httpd2.2 配置httpd2.3 启动httpdf2.4 测试httpd3. 部署FTP服务器3.1 YUM安装vsftpd3.2 配置vsf ...