public static string Intern(string str)
参数
- str
-
要在暂存池中搜索的字符串。
返回值
Type: System.String
如果暂存了 str,则返回系统对其的引用;否则返回对值为 str 的字符串的新引用。
一、字符串拘留池的引入
在一个程序中,如果将同一个字符串赋值给不同的字符串引用,那么系统会为多次分配内存空间,然而这些内存中存储的是同一个字符串(见下图)。这不仅浪费了宝贵的内存,还极大程度的降低了系统的性能。为了改善程序的性能,.net提出了字符串拘留池机制来解决这一问题。即公共语言运行时维护名为暂存池,其中包含对每个声明或在程序中以编程方式创建的唯一字符串的单个引用的表,从而节约的字符串存储空间。因此,存在一个实例并用特定值的文字字符串的仅一次在系统中。
例如,如果将相同的文字字符串分配给几个变量,则运行时将检索从暂存池中对文字字符串的相同引用,并将其分配给每个变量。
string a="abcde"; string b="abcde";
二、字符串拘留池的原理
一旦使用了字符串拘留池,当CLR启动的时候,会在内部创建一个容器,容器的键是字符串内容,值时字符串在托管堆上的引用。当一个新的字符串对象需要分配时,CLR首先检测容器中是否包含了该字符串对象,如果已经包含,就直接返回已经存在的字符串对象的引用;如果不存在,则新分配一个字符串对象,并把它添加到内部容器中同时返回该字符串对象的引用。但是当用new关键字显示的申明分配一个字符串对象时,字符串拘留池机制不会再起作用。
Intern 方法使用暂存池来搜索字符串的值等于 str。如果存在这样的字符串,则返回它在暂存池中的引用。如果该字符串不存在,对引用 str 添加到暂存池中,则返回该引用。
另:
public static String IsInterned (String s);
功能与上个方法相似。只是当字符串s不在字符串拘留池中时,不会分配新的对象,并返回null。