- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
关于ReferenceEquals(object a, object b)的问题
昨天跟几个同事一起讨论了下object.ReferenceEquals(object a, object b)方法, 其中有这样一个问题:
?object?c?=?foo;?string?d?=?foo;?bool?i?=?ReferenceEquals(c, d);?//return true
为什么返回的是true?c和d都是调用了string的赋值构造函数,string的赋值构造函数是不会在堆上申请空间的。那么如果string赋值构造函数不会在堆上申请空间,又不是指针,何来引用,看了下这段代码的IL,
??IL_0000:? nop??IL_0001:? ldstr??????foo??IL_0006:? stloc.0??IL_0007:? ldstr??????foo??IL_000c:? stloc.1??IL_0013:? ldloc.1??IL_0014:? ldloc.0??IL_0015:? call???????bool?[mscorlib]System.Object::ReferenceEquals(object,?object)
的确都是在栈上分配的, 并且第一个foo和第二个foo进栈的顺序是不一样的,引用怎么可能一样?另外, object类的ReferenceEquals(object a, object b)的实现是这样的:
?
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]public?static?bool?ReferenceEquals(object?objA,?object?objB){????return?(objA?==?objB);}
只做简单的==比较. 百思不得其解.. 最后一个同事在网上找到这样一句话:?
.NET 运行时在应用程序域中保留了一个字符串常值池, 当它将一个程序集加载到应用程序域中时,将该程序集的字符串常值与应用程序域的字符串常值池合并,从而避免了字符串常值的重复。(这样所有字符串常值只有一个副本,就可以对字符串常值进行引用比较,而且因为引用只需比较地址即可,所以比值比较快得多。)
?
关于字符串的驻留的机制,对于那些了解它的人肯定会认为很简单,但是我相信会有很大一部分人对它存在迷惑。在开始关于字符串的驻留之前,先给出一个有趣的Sample:
static void Main(string[] args){string str1 = ABCD1234;string str2 = ABCD1234;string str3 = ABCD;string str4 = 1234;string str5 = ABCD + 1234;string str6 = ABCD + str4;string str7 = str3 + str4;
Console.WriteLine(string str1 = \ABCD1234\;);Console.WriteLine(string str2 = \ABCD1234\;);Console.WriteLine(string str3 = \ABCD\;);Console.WriteLine(string str4 = \1234\;);Console.WriteLine(string str5 = \ABCD\ + \1234\;);Console.WriteLine(string str6 = \ABCD\ + str4;);Console.WriteLine(string str7 = str3 + str4;);
Console.WriteLine(\nobject.ReferenceEquals(str1, str2) = {0}, object.ReferenceEquals(str1, str2));Console.WriteLine(object.ReferenceEquals(str1, \ABCD1234\) = {0}, object.ReferenceEquals(str1, ABCD1234));
Console.WriteLine(\nobject.ReferenceEquals(str1, str5) = {0}, object.ReferenceEquals(str1, str5));Console.WriteLine(object.ReferenceEquals(str1, str6) = {0}, object.Referenc
您可能关注的文档
- 公路建设征地拆迁审计思考(西安佳信公路工程咨询有限公司).docx
- 六安市地税系统分局长信息化应用培训测试题.doc
- 公选案例分析真题.doc
- 公路运输企业基本情况表.doc
- 六安市资产管理信息系统用户手册.doc
- 六大限用物质对环境潜在的危害.doc
- 六年级 品社下册 第一单元.doc
- 六年级《品德与社会》(下册)课本疑难问题解答.doc
- 六年级上教案4.docx
- 六年级上第三单元作文:体现人和人互相关爱的事.doc
- 小学数学六年级下册期末测试卷及参考答案【培优a卷】.docx
- 2024年公务员(国考)之行政职业能力测验真题汇编【历年真题】.docx
- 小学六年级下册数学期末必刷题及参考答案【新】.docx
- 人教版小学二年级下册数学期中测试卷(考点精练).docx
- 2024年公务员(国考)之行政职业能力测验真题汇编附答案ab卷.docx
- 部编版一年级上册道德与法治期中测试卷含答案【综合题】.docx
- 小学六年级下册数学期末必刷卷附完整答案【夺冠系列】.docx
- 新人教版一年级上册数学期末测试卷附答案【黄金题型】.docx
- 2023人教版六年级下册数学期末测试卷及参考答案【轻巧夺冠】.docx
- 小升初数学期末测试卷及参考答案(基础题).docx
文档评论(0)