根据Jeff的说法,通过C#引用CLR,C#实习在CLR中实质上提升了性能。当CLR初始化时,会创建一个内部哈希表,其中键是字符串,值是对托管堆中的String对象的引用。公共静态String Intern(String str)方法Intern接受一个String,为它获取一个哈希码,并检查内部哈希表是否匹配。直到这里它的完美和工作方式。但是这里是游戏更换器" 在卸载AppDomain或进程终止之前,内部哈希表引用的String对象无法释放。"因此,您创建的每个字符串,其哈希代码将仅在Appdomain卸载时维护和释放,因此它是一个糟糕的设计?还是我的理解不清楚?请解释。
答案 0 :(得分:2)
您的理解很清楚。
你担心的原因不是。
如果您这样做:
for( int i = 0; i < 100000; i++ )
String.Intern( "bla-bla-bla-bla-bla" + i );
然后你将创建许多永远不会被垃圾收集的字符串。
但如果你这样做
String.Intern( myName );
String.Intern( myApp );
String.Intern( myCompany );
然后你将只创建3个永远不会被垃圾收集的字符串。
所以,如果你只是确保在第二个而不是第一个的情况下使用String.intern()
,那么你会没事的。
通常,如(Marc指出),您不必自己调用String.Intern()。编译器与运行时协作将确保实现值得实习的所有内容,或者可能值得实习。
为您举例说明您可能想要实习字符串的情况:比如说,您将创建有限数量的线程,并且您想要命名它们,比如说“Thread0”到“Thread9”,通过将一个从0到9的计数器附加到字符串“Thread”。并且说,您希望维护Dictionary<String,Thread>
,以便您可以按名称查找线程。在这种情况下,实习这些线程名称是值得的。线程名称在程序中不作为常量存在,因此它们尚未实现,并且您不会创建其中的许多,并且它们将在程序的整个运行时间内保持不变,因此它们是实习的良好候选者。