关于ReferenceEquals(object a, object b)的问题.doc

 关于ReferenceEquals(object a, object b)的问题.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

muyefushanjiab + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档