C#中 Equals和= =的区别

前言:最近感觉技术进步实在是太慢,一直被游戏缠身不能自拔哈哈,但是游戏打多了真的是感觉整个人浮躁的不行,所以我现在要去游戏多写代码多看书,今天在博客园中看到一个前辈去阿里面试的面试题,由浅入深的问了很多问题,所以我想这就是个契机,可以通过答题来学习知识让自己进步,闲话少说,我们正式开始

0.复习堆栈知识

因为要通过引用类型和值类型分情况讨论,所以对C#中堆栈知识的复习还是有必要的

简单说结论:

  1·栈通常保存着我们代码执行的步骤,而堆上存放的则多是对象,数据等。

  2·值类型存放在栈上,引用类型存放在堆上,但是会在栈中生成一个指针。

  3·一个值类型被声明在一个方法体外并且在一个引用类型中,那它就会在堆上进行分配。

1·分情况讨论

在C#中,讨论这个问题要分三种情况

  • 值类型
  • 引用类型
  • String 字符串类型

1.1值类型

在值类型中,Equals都是通过==来实现的,类似于:

public override bool Equals(object obj)
{
return ((obj is bool) && (this == ((bool) obj)));
}

所以在值类型中,Equals和==其实是完全一样的东西。

1.2引用类型

本质上来说,Equals都是集成自Object的Equals方法,通过反编译,可以看到Equals内部的逻辑,即:引用相同返回true,或者两个对象都不为空的情况下,内部值相同,也返回true

public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}

所以在值类型中,==是判断引用是否相同,而Equals判断内部值是否相同,当然如果引用相同内部值肯定也相同。

1.3 String字符串类型

字符串类型比较特殊,是因为在string类的内部对Equals和==两个方法都进行了重写,是的你没看错,两个都重写,所以很特殊

public static bool operator ==(string a, string b)
{
return Equals(a, b);
} public static bool Equals(string a, string b)
{
if (a == b)
{
return true;
}
if ((a == null) || (b == null))
{
return false;
}
if (a.Length != b.Length)
{
return false;
}
return EqualsHelper(a, b);
}

可以看到最后全部都定位到了EqualsHelper这个方法里面,所以在string里面,Equals和==的意义是相同的,全都是表示判断string的内部内容是否相同。(EqualsHelper方法的代码在文末)

结语和总结

  • ==判断引用是否相同
  • Equals判断内部值是否相同
  • 不同情形下,具体情况稍有差别

用了一整个晚上的时间把这个知识梳理研究明白,感觉时间过得很慢,也过得挺有意义的,还复习了markdown的语法,希望这是我改变自己生活的一个好的开始,预告下一篇文章的主题是:“什么时候捕获异常,什么时候抛出异常”

private static unsafe bool EqualsHelper(string strA, string strB)
{
int length = strA.Length;
fixed (char* chRef = &strA.m_firstChar)
{
fixed (char* chRef2 = &strB.m_firstChar)
{
char* chPtr = chRef;
char* chPtr2 = chRef2;
while (length >= 10)
{
if (*(((int*) chPtr)) != *(((int*) chPtr2)))
{
return false;
}
if (*(((int*) (chPtr + 2))) != *(((int*) (chPtr2 + 2))))
{
return false;
}
if (*(((int*) (chPtr + 4))) != *(((int*) (chPtr2 + 4))))
{
return false;
}
if (*(((int*) (chPtr + 6))) != *(((int*) (chPtr2 + 6))))
{
return false;
}
if (*(((int*) (chPtr + 8))) != *(((int*) (chPtr2 + 8))))
{
return false;
}
chPtr += 10;
chPtr2 += 10;
length -= 10;
}
while (length > 0)
{
if (*(((int*) chPtr)) != *(((int*) chPtr2)))
{
break;
}
chPtr += 2;
chPtr2 += 2;
length -= 2;
}
return (length <= 0);
}
}
}

C#中 Equals和= =的区别的更多相关文章

  1. java中equals和==的区别 (转)

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

  2. 【转】Java中equals和==的区别

    [转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...

  3. (转)Java中equals和==的区别

    java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号( ...

  4. C# 中 equals( ) 和 == 的区别和用法

    Equals: 下面的语句中,x.y 和 z 表示不为 null 的对象引用. * 除涉及浮点型的情况外,x.Equals(x) 都返回 true. * x.Equals(y) 返回与 y.Equal ...

  5. Java 中 Equals和==的区别(转)

    另外一篇参考: https://blog.csdn.net/striverli/article/details/52997927 在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的 ...

  6. Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?

    首先明确一点,equals是方法,==是操作符. 1. 如果比较的是基本数据类型: 只讨论==,因为equals是不存在的,因为java中基本数据类型不能调用method的. 2. 如果比较的是引用类 ...

  7. java中equals和==的区别详解

    java中的数据类型,可分为两类: 1.基本数据类型. byte,short,char,int,long,float,double,boolean这八大原始数据类型他们之间的比较,使用“==”,比较的 ...

  8. C#中equals和==的区别有哪些

    本文导读:C# 中==是用来判断变量的值是否相等,相等返回true,不相等返回false.Equals是用来判断两个对象(除string类型外)是否相等,相等的 条件是:值,地址,引用全相等,因为St ...

  9. java中equals()和==的区别

    java中的数据类型 基础数据类型 基础数据类型有byte.short.char.int.long.float.double.bool.String.除了 String 会比较地址,其它的基础类型的比 ...

随机推荐

  1. Linux之yum

    yum相当于是linux的本地的软件资源库,每个一段时间必须手动更新yum update

  2. C语言精神

    国际标准化组织与1990年发布了第一个ANSI/ISO C标准 在该委员会制定的指导原则中,最有趣的可能是:保持C的精神.委员会在表达这一精神时列出了一下几点: 信任程序员: 不要妨碍程序员做需要做的 ...

  3. ROS多机通信计算机网络配置

    以实现master和nico的互联共享信息为例 1 查看IP地址 $ifconfig 查看ip地址 可以看到 master的IP为192.168.1.10 nico的IP为192.168.1.103 ...

  4. 老李分享:loadrunne动态查询db2数据库

    老李分享:loadrunne动态查询db2数据库   poptest老李认为性能测试脚本开发不仅仅涉及到脚本开发的技术层面,同时也要对一些其他技术有所了解动态链接库的技术,线程安全等等,建议在做下面的 ...

  5. 老李秘技:LoadRunner支持参数文件极限是多大

    老李秘技:LoadRunner支持参数文件极限是多大   Controller不支持参数文件大于20m

  6. 性能测试培训:sql server性能测试分析局部变量的性能影响

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培训中,为了提高学员性能优化的经验,加入了 ...

  7. Angularjs 动态添加指令并绑定事件

    先说使用场景,动态生成DOM元素并绑定事件,非常常见的一种场景,用jq实现效果: http://jsbin.com/gajizuyuju/edit?html,js,output var count=0 ...

  8. 告别S! S! H!秒杀终端工具——FastLogin快捷登录

    题记:自从接触到"跳板机"的概念后,一直就被烦不胜烦的机器名,ip地址,用户名,密码折腾的死去活来,心说能有个小精灵随时帮我输入那些重复的登录信息就好了.我见过最挫的方式就是用记事 ...

  9. 【 js 基础 】 深浅拷贝

    underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...

  10. 深入Web请求过程

    B/S网络架构 带来的好处: 1.客户端使用同一的浏览器. --浏览器的交互特性使其使用起来非常简便 2.服务器基于统一的http.  --简化.规范开发模式,大大节省开发成本.如tomcat ngi ...