System.String.Intern 方法
方法描述
检索系统对指定 String 的引用。
语法定义(C# System.String.Intern 方法 的用法)
public static string Intern( string str )
参数/返回值
参数值/返回值 | 参数类型/返回类型 | 参数描述/返回描述 |
---|---|---|
str | System-String | 要在暂存池中搜索的字符串。 |
返回值 | System.String | 如果暂存了 str,则返回系统对其的引用;否则返回对值为 str 的字符串的新引用。 |
提示和注释
公共语言运行时通过维护一个表来存放字符串,该表称为“暂存池”,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。 因此,具有特定值的字符串的实例在系统中只有一个。
例如,如果将同一字符串分配给几个变量,运行时就会从暂存池中检索对该字符串的相同引用,并将它分配给各个变量。
Intern 方法使用暂存池来搜索与 str 值相等的字符串。 如果存在这样的字符串,则返回暂存池中它的引用。 如果不存在,则向暂存池添加对 str 的引用,然后返回该引用。
在下面的示例中,值为“MyTest”的字符串 s1 已被拘留,因为它是程序中的文本。 System.Text.StringBuilder 类生成与 s1 同值的新字符串对象。 对该字符串的引用被分配给 s2。 Intern 方法搜索与 s2 具有相同值的字符串。 由于存在此类字符串,因此该方法返回分配给 s1 的引用。 该引用又被分配给 s3。 引用 s1 和 s2 相比较的结果是不相等,因为它们引用了不同的对象;而引用 s1 和 s3 相比较的结果是相等,因为它们引用了同一字符串。
C#
VB
复制
string s1 = "MyTest";
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
string s3 = String.Intern(s2);
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
将此方法与 IsInterned 方法进行比较。
版本注意事项
在 .NET Framework 3.5 版 Service Pack 1 中,对于空字符串留用,Intern 方法将恢复其在 .NET Framework 1.0 版 和 .NET Framework 1.1 版 中的行为。 在下面的示例中,在将值为 Empty 的 StringBuilder 对象转换为字符串后,通过调用 Intern 方法,为变量 str1 分配对 Empty 的引用,并为变量 str2 分配对 Empty 的引用。 然后,比较 str1 和 str2 所包含的引用是否相等。
C#
VB
复制
string str1 = String.Empty;
string str2 = String.Empty;
StringBuilder sb = new StringBuilder().Append(String.Empty);
str2 = String.Intern(sb.ToString());
if((object)str1==(object)str2)
Console.WriteLine("The strings are equal.");
else
Console.WriteLine("The strings are not equal.");
在 .NET Framework 1.0 中,.NET Framework 1.1 和 .NET Framework 3.5 SP1、str1 和 str2 是相等的;在 .NET Framework 2.0 版 Service Pack 1 和 .NET Framework 3.0 版 中,str1 和 str2 是相等。
性能注意事项
如果要减少应用程序分配的内存总量,请记住留用字符串有两个不希望出现的副作用。 首先,为留用的 String 对象分配的内存在公共语言运行时 (CLR) 终止之前不大可能释放。 这是因为 CLR 对留用的 String 对象的引用可能保持到应用程序终止之后,甚至可能保持到应用程序域终止之后。 其次,要留用字符串,必须先创建字符串。 即使 String 对象使用的内存最终将通过垃圾回收,仍然必须分配该内存。
.NET Framework 2.0 版引入了 CompilationRelaxations.NoStringInterning 枚举成员。 NoStringInterning 成员将程序集标记为不需要字符串拘留。 可以使用 CompilationRelaxationsAttribute 特性将 NoStringInterning 应用于某个程序集。 此外,当您使用Ngen.exe(本机映像生成器) 先于运行时编译程序集时,字符串将不在模块间留用。
System.String.Intern 方法例子
下面的示例使用三个值相等的字符串确定新建的字符串和留用的字符串是否相等。
// Sample for String.Intern(String) using System; using System.Text; class Sample { public static void Main() { String s1 = "MyTest"; String s2 = new StringBuilder().Append("My").Append("Test").ToString(); String s3 = String.Intern(s2); Console.WriteLine("s1 == '{0}'", s1); Console.WriteLine("s2 == '{0}'", s2); Console.WriteLine("s3 == '{0}'", s3); Console.WriteLine("Is s2 the same reference as s1?: {0}", (Object)s2==(Object)s1); Console.WriteLine("Is s3 the same reference as s1?: {0}", (Object)s3==(Object)s1); } } /* This example produces the following results: s1 == 'MyTest' s2 == 'MyTest' s3 == 'MyTest' Is s2 the same reference as s1?: False Is s3 the same reference as s1?: True */
异常
异常 | 异常描述 |
---|---|
ArgumentNullException | str 为 null。 |
版本信息
.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1
适用平台
Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。