简单整型比较:

从这里可以看出整型比较无论是==和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#对象比较的总结的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  5. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  6. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  7. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  8. ASP.NET内置对象的总结

    1. Response对象可形象的称之为响应对象,用于将数据从服务器发送回浏览器. 实例源码:链接: http://pan.baidu.com/s/1dDCKQ8x 密码: ihq0  2. Requ ...

  9. ADO.NET对象的详解

    1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...

  10. 对Castle Windsor的Resolve方法的解析时new对象的探讨

    依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...

随机推荐

  1. Nginx服务器 配置 https

    参考 这里 1. 购买证书 2. 补全信息 3. 下载证书( .pem + .key ) 4. 上传至服务器  /usr/local/nginx/conf/cert 下 5. 修改 nginx.con ...

  2. promise的异步链式调用

    场景:  淘米  干净的米下锅  蒸米饭  吃米饭 ;这几个步骤是一个接着一个执行, 也就是只有前面的做完后, 才会去做后面的. 并且每一步都需要用一部分时间去执行. function deal(ta ...

  3. SQL Server Cast、Convert数据类型转换

    一.概述 本篇文章转载来着官网在线文档,文章主要介绍SQL Server数据类型转换相关语法.隐式转换.Date样式等. 语法 Syntax for CAST: CAST ( expression A ...

  4. 【RL-TCPnet网络教程】第3章 初学RL-TCPnet的准备工作及其快速上手

    第3章       初学RL-TCPnet的准备工作及其快速上手 俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境.一旦上手后,深入的学习就相对容易些 ...

  5. Java两种方法实现循环报数

    问题描述: 十个猴子围成一圈选大王,依次1-3 循环报数,报到3 的猴子被淘汰,直到最后一只猴子成为大王.问,哪只猴子最后能成为大王? 方法一:Java链表 public class TestAll ...

  6. limit实现的分页查询

    背景:原先是一次性查询加载到前段,表格插件自动分页,最近查询的数据量越来越大,长的时候需要等好几十秒,决定自己写一个后端分页,我写的和网上大神的略有不同,不是后端写一个类封装分页的参数,每次查询都是穿 ...

  7. MYSQL手册

    原文出处:http://www.cnblogs.com/gaofei-1/p/7152875.html MySQL配置文件 MySQL软件使用的配置文件名为my.ini,在安装目录下. MySQL常用 ...

  8. [Swift]LeetCode73. 矩阵置零 | Set Matrix Zeroes

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place. Exampl ...

  9. [Swift]LeetCode110. 平衡二叉树 | Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  10. [Swift]LeetCode288. 唯一单词缩写 $ Unique Word Abbreviation

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...