C#对象比较的总结
简单整型比较:
从这里可以看出整型比较无论是==和Equals方法都是进行比较,比较“正常”
int m1 = ;
int m2 = ; Console.WriteLine(m1 == m2);//值比较True
Console.WriteLine(m1.Equals(m2));//值比较True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False
object比较:
类型如果是Object,进行==比较时判断的是地址是否相同,而Equals则是其虚方法判断值是否正常
object m1 = ;
object m2 = ; Console.WriteLine(m1 == m2);//引用类型引用比较False
Console.WriteLine(m1.Equals(m2));//Object虚方法值比较True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False
整型赋值比较:
这个就类似浅拷贝
int m1 = ;
int m2 = m1; Console.WriteLine(m1 == m2);//值比较True
Console.WriteLine(m1.Equals(m2));//值比较True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用比较False
object和其他值类型比较:
object m1 = ;
int m2 = ; Console.WriteLine(m1.Equals(m2));//Object虚方法值比较True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//引用False
字符串类型比较:
字符串虽然是引用类型,但是C#对其做有特殊优化,从下面的结果就可以看出,==和Equals比较的是字符串内容相同,而字符串内容相同的两个变量引用也相同,是经过运行时优化了的。
string m1 = "tg903eiotf38";
string m2 = "tg903eiotf38"; Console.WriteLine(m1 == m2);//字符串值比较True
Console.WriteLine(m1.Equals(m2));//字符串值比较True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//字符串引用优化比较True
现有一class:
public class Student
{
public long Id { get; set; } public string Name { get; set; }
}
引用类型比较:
简单的引用类型,==和Equals比较的是都是地址引用
Student m1 = new Student()
{
Id = ,
Name = "朝野布告",
};
Student m2 = new Student()
{
Id = ,
Name = "朝野布告",
}; Console.WriteLine(m1 == m2);//False
Console.WriteLine(m1.Equals(m2));//False
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//False
Student m1 = new Student()
{
Id = ,
Name = "朝野布告",
};
Student m2 = m1; Console.WriteLine(m1 == m2);//True
Console.WriteLine(m1.Equals(m2));//True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True
引用类型赋值比较:
类似浅拷贝
Student m1 = new Student()
{
Id = ,
Name = "朝野布告",
};
Student m2 = m1; m1.Name = "飓风"; Console.WriteLine(m1 == m2);//True
Console.WriteLine(m1.Equals(m2));//True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True
Console.WriteLine(m1.Name);//飓风
Console.WriteLine(m2.Name);//飓风
object m1 = new Student()
{
Id = ,
Name = "朝野布告",
};
object m2 = m1; Console.WriteLine(m1 == m2);//True
Console.WriteLine(m1.Equals(m2));//True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//True
匿名类型比较:
匿名类型==比较的是地址的引用,而哈希码的生成看的是每个数据成员的值,因此其全部值一样则哈希码一样,Equals判断也一样的道理
var m1 = new { Id = , Name = "朝野布告" };
var m2 = new { Id = , Name = "朝野布告" };
Console.WriteLine(m1 == m2);//False
Console.WriteLine(m1.GetHashCode());//
Console.WriteLine(m2.GetHashCode());//
Console.WriteLine(m1.Equals(m2));//True
Console.WriteLine(System.Object.ReferenceEquals(m1, m2));//False
C#对象比较的总结的更多相关文章
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- ASP.NET内置对象的总结
1. Response对象可形象的称之为响应对象,用于将数据从服务器发送回浏览器. 实例源码:链接: http://pan.baidu.com/s/1dDCKQ8x 密码: ihq0 2. Requ ...
- ADO.NET对象的详解
1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...
- 对Castle Windsor的Resolve方法的解析时new对象的探讨
依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...
随机推荐
- angular.toJson()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 在浏览器输入URL时发生了什么
浏览器器检查cache,如果请求对象已经缓存并且是最新的,执行第9步. 浏览器询问操作系统,请求服务器的IP地址 操作系统进行DNS查找,然后告诉浏览器服务器的IP 浏览器和服务器简历一个TCP连接( ...
- Restful levels&HATEOAS
RESTful: Rest是一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等 ...
- iOS浏览器 new Date() 返回 NaN
问题 项目中某个地方用到了倒计时,因此打算通过 new Date() 函数实现.但在 iPhone 真机测试的时候,显示的结果不符合预期.通过调试发现 iOS 中 new Date('2017-01- ...
- 报错Domain=NSCocoaErrorDomain Code=3840 "Garbage at end."
网络请求出现报错:Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." 出现的问题是后台返回了两次json数据!
- TCP协议学习总结(中)
很多人都说TCP协议是一个十分复杂的协议,在学习当中,我对协议每一个问题都分解学习后,每一个分解我都能体会和理解它的要点,并不难理解.但我把这些拆分的细节合并后,确认感觉这样一个协议相对“臃肿”但又好 ...
- linux 完全关闭tomcat
由于直接调用tomcat的 shutdown.sh 有时无法完全关闭掉tomcat,使用 ps -ef | grep tomcat 查找发现tomcat依然还存在,并未完全关掉.在 catalina. ...
- Linux(Ubuntu) 下自然码加辅助码双拼输入的解决方案
Linux(Ubuntu) 下自然码加辅助码双拼输入的解决方案 环境: Ubuntu 14.04 LTS 解决方案是 ibus-Rime 输入法, 再加上搭配自然码的配置表 (1) ibus 首先安装 ...
- Linux中FTP远程传输,SSH远程连接,以及SCP远程拷贝
常用服务器ftp.ssh 1. Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于 ...
- 记一次尴尬的git reset丢失分支故障
最近...似乎一直在踩坑... 也不是什么故障,只是把一个分支的功能弄没了,之后在reflog里找到又恢复了. 产生原因是有同事错误地把分支B merge到了分支A并push. 我直接在分支A上res ...