简单整型比较:

从这里可以看出整型比较无论是==和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. icpc2018焦作-I. Distance

    第一发又超时了... 题目大意:给你n个点,然后给你n-1的数,表示两两距离,然后让你输出n个答案,第i个答案表示从这n个点里面挑i个点,然后这i个点两两之间会有一个距离,答案要求这些距离和的最大值. ...

  2. unittest中常用的几个断言

    a.相等 (a==b)内容一样,类型一致 from init import * import unittest class Baidu_Title(Info): def test_baidu_titl ...

  3. 关于Tensorflow安装opencv和pygame

    1.安装opencv https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv C:\ProgramData\Anaconda3\Lib\site-pack ...

  4. 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(2)

    二.nova-api 步骤3:nova-api接收请求 nova-api接收请求,也不是随便怎么来都接收的,而是需要设定rate limits,默认的实现是在ratelimit的middleware里 ...

  5. go 使用 c接口

    在使用go语言时, 有时为了方便可以直接调用c语言的接口与库, 不需要重复编写. 那就来说说在go语言里面如何调用c的接口 首先编写好c语言的源文件与头文件,这里举一个简单的例子,实现一个字符串大小写 ...

  6. Java中的线程协作之Condition

    一.Condition接口 1.Condition接口的常用方法介绍 /** * 已经获取到锁的线程调用该方法会进入等待状态,知道其他持有锁的线程通知(signal)等待队列中的线程或者被中断退出等待 ...

  7. [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

  8. [Swift]LeetCode125. 验证回文串 | Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  9. [Swift]LeetCode944. 删除列以使之有序 | Delete Columns to Make Sorted

    We are given an array A of N lowercase letter strings, all of the same length. Now, we may choose an ...

  10. 关于video标签移动端开发遇到的问题,获取视频第一帧,全屏,自动播放,自适应等问题

    最近一直在处理video标签在IOS和Android端的兼容问题,其中遇到不少坑,绝大多数问题已经解决,下面是处理问题经验的总结: 1.获取视频的第一帧作为背景图: 技术:canvas绘图 windo ...