惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
SecWiki News
SecWiki News
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
量子位
M
MIT News - Artificial intelligence
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
TaoSecurity Blog
TaoSecurity Blog
博客园 - 【当耐特】
H
Heimdal Security Blog
腾讯CDC
The Last Watchdog
The Last Watchdog
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News: Ask HN
Hacker News: Ask HN
S
Schneier on Security
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
博客园 - 司徒正美
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cybersecurity and Infrastructure Security Agency CISA
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
Application and Cybersecurity Blog
Application and Cybersecurity Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Threatpost
月光博客
月光博客
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
T
Troy Hunt's Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
D
DataBreaches.Net
O
OpenAI News
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
小众软件
小众软件
V
Vulnerabilities – Threatpost
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
T
The Exploit Database - CXSecurity.com
Martin Fowler
Martin Fowler
美团技术团队
P
Privacy International News Feed

博客园 - 酷咖啡

收藏:精妙SQL语句 用户中心 - 博客园 博文阅读密码验证 - 博客园 web2.0配色收集 也谈C#中的反射用法 C#访问修饰符 [LoveCherry]一步一步学Linq to sql系列文章 [LoveCherry]无废话C#设计模式系列文章 .Net常用资源收集 Some word in English about Company website Reflection,Regular Expression,Threading,IO,AppDomain,Web Service/Remoting Service,ORM 收藏:笔记本得理器型号规格 如何让虚拟目录里面的webconfig不继承网站[转] 刚刚用上了百度Hi 自定义可绑定数据的业务对象实体和强类型 Asp.net 2.0 网站首页生成静态的方法 数据库设计的5种常见关系 [收集]visual studio文件扩展名 说说最近的工作
C#中相等的判断
酷咖啡 · 2008-04-15 · via 博客园 - 酷咖啡

我主要是用例子来说明一下问题:
首先说明一下string字符串,string它是一个引用类型的,只不过是它拥有了值类型的特征,
而通过书中的介绍
ReferenceEquals方法不能继承,它用来专门比较引用类型是否相等,所以它是比较引用的首选,有了它我们可以毫无顾虑的判断,并且简单,看例子:

上面的例子再次可以证明既然它能比较出连个字符串是否相等,就证明字符串肯定是引用类型,
再者如果比较字符串str1与str2,答案是不相等,因为str2新建了一个对象(new),所以两者不存在引用关系,
肯定是false,而我们再次再介绍一下,看了源码我发现string类没有重写“+"这个运算符号,所以我们在利用字符串进行相加时,只是单纯意义上的字符连接,可能不会像java一样每加一次会创建新对象,于是当我们进行字符串a和b进行比较时,会发现仍然相等,所以说明两者出于同一个对象,大家还有疑问时我们对字符串进行直接复制,就会new对象呢?答案是不会,看了java对此的解释,通常字符串有一个STRING池.当我们进行字符串直接复制时,都会通过这个string池,如果在string池中找到已有的字符串,那么就指向同一个字符串地址,与我们new一个string类是完全不一样。
继续介绍
equal和==在自定义类型是ValueType的时候要改写

当自定义类型是ReferenceType的时候,如果想改变RefrenceType默认的用对象标志判
等的方式,可以改写equal

当自定义类型是RefrenceType的时候,最好不要改写operator==.
还有需要注意的是==比较对于非自定义的值类型就是比较值得大小,
而对于比较引用类型,就是比较是否出自由同一个对象,
对于自定义的值类型如struct可以自己来重写,
对于自定义的引用类型class最好不要用来重写,
并且重写了==就需要重写!=还要重写equal,如果重写了equal就需要重写GetHashCode方法,
因为两者要相等就必须该方法返回值要相等。


注意我上面的例子定义了两个重写equal,用第一个的话为false因为它调用了==比较,我们介绍过==比较对象时是要比较两个是否出于一个对象,显然不是。加上这句acar=bcar;结果就是相等了。
再看第二种方法,因为我们是自定义的类,所以我们根据我们的需求判断两个对象相等的条件,这里我们选择speed,只要两个对象speed相等我们就判断这两个对象是相等的。
具体实现看代码大家已经八九不离十了,而大家看了我重写的GetHashCode(),里面返回speed,这点需要说明的是,我提过重写equal必须要重写该方法要返回一样的值,那这个值什么?这里我选择了speed,当然我这个写法太简单了,对于重写GetHashCode()的规则很多,但道理都是一样的那就是:相等的对象必须返回相同的GetHashCode(),这个时候你就可以定里面返回的东西啦。
对于equal在比较非自定义的值类型时与==相同,
对比较引用类型的时候也是判断是否出于同一个对象,
下面我们接着介绍string,
既然string是引用类型,那

命名str1和str2不是同一个引用(前面已经介绍),但为什么后面的比较确相等呢?
我们看源代码可知道string它重写了==和equal这两个方法,我们不追究里面的实现,
但至少它里面的实现应该是和我们前面提到的speed比较相似,并没有比较对象的引用,
而是比较对象的值