我在CLR VIA C#一书中看到这句话:When the CLR initializes,it creates an internal hash table in which the keys are string an the values are references to String objects in managed heap.然后后面又有一句:By default,when an assembly is loaded,the CLR interns all of the literal strings described in the assembly's metedata.我的理解是:
当我们执行这样一条语句时:string h="CSDN好人多";首先编译的时候,把"CSDN好人多"加载进元数据表.然后当执行string h="CSDN好人多";时,从元数据表加载"CSDN好人多",然后检查hash table里有没这个字符串,有则返回引用,没则创建对象并返回引用.但是,CLR采用的是一个叫intern的方法检查hash table并返回对象,该方法声明如下:public static string intern(string str),可以见到参数里是一个string对象的引用,但是这时还没创建该字符串对象,哪来的对象引用呢??还是我上面的理解有错??
请指教!~~~谢谢~~~~~

解决方案 »

  1.   

    String是引用类型放在了堆中,不可变字符串策略
    CLR内部实际上维护了一个不可变字符串表。在堆中分配的字符串可以通过String.Intern函数确保其被加入此表;通过String.IsInterned函数判断自己是否在表中。如果在表中,则可以通过引用来直接对字符串进行比较,大大提高字符串比较效率。
    Metadata表中实际上本来就有#String流和#US流,分别保存程序中固化的字符串和用户字符串
      

  2.   

    意思是“CSDN好人多”这个字符串首先作为常量会先加载,存放在字符串池中。
    Intern是把未在字符串缓冲池的字符串对象放入缓冲池。
    IsIntern才是检查的方法。