【CSharp】C#中equals与==小记
昨天技术群中的一个小伙伴发了几个字符串以及值类型比较的面试题,没想到我们的答案不尽人意。。。下面是截图以及答案,看看与各位看官的答案是否相同。
0x00:
查看了几篇前辈写的博客后也有了自己的一些小总结,如有错误请大家指教出来,不胜感激!下面是参考资料的传送门。
http://new-fighter.iteye.com/blog/1634800
0x01:
众所周知Java中的String有两种声明方式,1:String str1 = "abc";2:String str2 = new String("abc");这两种存在很大的差异。这里不说,因为此篇的主角是C#。而C#中的string作为引用类型只有一中方式,也就是上述的方式一。在此无论使用“==”还是“Equals”只要是string的字面量相同则比较结果就为ture。这个没什么好说的,下面说一下非string的其他引用类型。
private class ObjectA
{
public string cName = "";
;
}
ObjectA oa1 = new ObjectA();
ObjectA oa2 = new ObjectA();
oa1.cName = "Clown";
oa1.iAge = ;
oa2.cName = "Clown";
oa2.iAge = ;
bool b01 = oa1.Equals(oa2);
bool b02 = oa1 == oa2;
;
;
bool b5 = (o1 == o2); // false
bool b6 = (o1.Equals(o2)); // false
0x02:
等等,先不要着急关闭浏览器 。引用类型中还有一个特殊的,那就是匿名类。所以上面的0x01中的总结是有BUG的。我们还是先看一下代码,如下:
};
};
, name = " };
int i1 = a1.GetHashCode(); // -1902033810
int i2 = a2.GetHashCode(); // -1902033810
int i3 = a3.GetHashCode(); // -843859346
bool b4 = a1.Equals(a2); // true
bool b5 = a1.Equals(a3); // false
bool b6 = a1 == a2; // false
//bool b7 = (a1 == a3); // 如果这面写直接就会爆语法错误的
0x03:
以上实验结果可以粗略总结为:C#中string(引用类型)通过“==”与“Equals”比较都是对字面量进行比较的,除去string与匿名类外的其他引用类型“==”与“Equals”比较的都是引用地址。而匿名类是通过“==”进行值比较,“Equals”是对引用地址的比较。且还得出匿名类顺序不同则AnonyType是不同的类型。
而序中提到的short.Equals(int)的比较是对我最为困惑的,现在可以根据以上结果分析,short.Equals中形参是Object类型,而引用类型通过“Equals”比较的是引用地址而非字面值。但int.Equals(int),形参为值类型的int,值类型存储在栈上比较的是字面值。故返回true而前者返回false。
【CSharp】C#中equals与==小记的更多相关文章
- Java中equals与==和comparaTo的区别
一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- (转载)Log4Net 在多层项目中的使用小记
(原创)Log4Net 在多层项目中的使用小记 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用Log4Net的一些记录.网上有很多相关的教程,但是各 ...
- C#中 Equals和= =的区别
C#中 Equals和= =的区别 前言:最近感觉技术进步实在是太慢,一直被游戏缠身不能自拔哈哈,但是游戏打多了真的是感觉整个人浮躁的不行,所以我现在要去游戏多写代码多看书,今天在博客园中看到一个前辈 ...
- (转)Java中equals和==的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号( ...
- Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用
以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...
- java中equals相同,hashcode一定相同ma
一.jdk中equals和hashcode的定义和源码进行分析 1.java.lang.Object中对equals()方法的定义 java.lang.Object中对hashCode()方法的定义 ...
- Java 中 Equals和==的区别(转)
另外一篇参考: https://blog.csdn.net/striverli/article/details/52997927 在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的 ...
随机推荐
- 建立MySQL的ODBC
1. 进入控制面板->管理工具->数据源(ODBC): 2. 点击添加,数据源驱动程序选择MySQL ODBC 5.1 Driver: 3. 弹出MySQL Connecotor/ODBC ...
- 【Java每日一题】20161103
package Nov2016; import java.util.List; public class Ques1103 { public void method01(String[] array) ...
- MySQL: LEAVE Statement
https://www.techonthenet.com/mysql/loops/leave.php This MySQL tutorial explains how to use the LEAVE ...
- luogg_java学习_01_JAVA基本概述
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 1.1基础常识 常用的dos命令 dir 列出当前目录 ...
- myeclipse中导入的js文件报错(出现红叉叉,提示语法错误)
为了做一个页面特效,导入了一个jquery文件,怎想,myeclipse竟然报错说是语法错误,但是这个js文件我是从官网上下载的,不应该出错才对,百度谷歌之后终于找到了解决办法: 选中报错的js文件, ...
- 第 12 章 CSS 入门
学习要点: 1.使用 CSS 2.三种方式 3.层叠和继承 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS(层叠样式表),它是用来对 HTML 文档外观的表现形式进行排版和格式化. 一.使用 ...
- javascript脚本设置输入框只读的问题
今天在开发中准备通过javascript设置input框只读属性的时候,用document.getElementById('input').readonly='readonly';结果发现这样设置无效 ...
- asp.net C#发送邮件类
很久前写的一个简单邮件发送类分享给大家: using System; using System.Data; using System.Configuration; using System.Web; ...
- sql2008“备份集中的数据库备份与现有的xxx数据库不同”解决方法
因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一.打开sql企业管理器,新建查询 执行以下SQL代码: RESTORE DATAB ...
- C#各种数组直接的数据复制/转换
之前做Opengl程序,用的的C#的SharpGL这个库,里面有各种奇怪绑定的函数,比如原型为: void glInterleavedArrays(uint format, int stride, v ...