运用共享技术有效地支持大量细粒度的对象。
在.Net中处理字符串时,有一个很重要的机制,叫做字符串驻留机制,就是运用了享元模式。CLR(公共语言运行库)通过维护一个表来存放字符串,该表称为拘留池,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。因此,具有特定值的字符串的实例在系统中只有一个。
CLR中使用享元模式实现字符串驻留的过程:CLR内部维护着一块特殊的数据结构——我们可以把它看成是一个Hash table,这个Hash table维护者大部分创建的string(我这里没有说全部,因为有特例)。这个Hash table的Key对应的相应的string本身,而Value则是分配给这个string的内存块的引用。当CLR初始化的时候创建这个Hash table。一般地,在程序运行过程中,如果需要的创建一个string,CLR会根据这个string的Hash Code试着在Hash table中找这个相同的string,如果找到,则直接把找到的string的地址赋给相应的变量,如果没有则在托管堆中创建一个string,CLR 会先在managed heap中创建该strng,并在Hash table中创建一个Key-Value Pair——Key为这个string本身,Value位这个新创建的string的内存地址,这个地址最重被赋给响应的变量。
通过Strig类和拘留池相关的方法Intern(String str)、IsInterned(String str)的底层实现可以更加直观的了解以上过程。
时间: 2025-01-21 16:24:39