本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

String.Intern 方法 (String)

 

擷取指定的 String 的系統參考。

命名空間:   System
組件:  mscorlib (於 mscorlib.dll)

public static string Intern(
	string str
)

參數

str
Type: System.String

要在保留集區中搜尋的字串。

傳回值

Type: System.String

如果已經保留,則為系統的 str 參考,否則為具有 str 值之字串的新參考。

Exception Condition
ArgumentNullException

strnull

Common language runtime 可以節省字串儲存體,藉由維護稱為保留集區,其中包含每個唯一的常值字串,宣告或以程式設計方式建立在程式中的單一參考的資料表。 因此,具有特定值的常值字串的執行個體只存在一次在系統中。

比方說,如果您將相同的常值字串指派給數個變數時,執行階段擷取的常值字串來保留集區從相同的參考,並將它指派給每個變數。

Intern方法會使用保留集區中,搜尋字串的值等於str 如果此類字串存在,則會傳回它在保留集區的參考。 如果字串不存在,參考str保留集區,則會傳回該參考加入。

在下列範例中,字串 s1 有"MyTest"的值,是已被保留,因為它是在程式中的常值。 System.Text.StringBuilder類別會產生具有相同的值為 s1 的新字串物件。 該字串的參考,則指派給 s2。 Intern方法會搜尋具有相同的值為 s2 的字串。 因為此類字串存在,則方法會傳回相同的參考指派給 s1。 接著,該參考會指派給 s3。 參考 s1 和 s2 比較不相等因為兩者參考不同的物件。參考 s1 和 s3 比較相等,因為兩者參考相同的字串。

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 和 1.1 中的關於實習空字串。 在下列範例中,變數str1參考會指派給Empty,和變數str2指派參考Empty藉由呼叫傳回Intern方法在轉換後的StringBuilder物件,其值為Empty為字串。 然後中包含的參考str1str2會比較是否相等。

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.");

In the .NET Framework 1.0, .NET Framework 1.1, and .NET Framework 3.5 SP1, str1 and str2 are equal. 在.NET Framework 2.0 Service Pack 1和.NET Framework 3.0,str1str2不相等。

如果您嘗試減少記憶體總數量會配置您的應用程式,請記住,實習字串有兩個不必要的副作用。 首先,記憶體配置給實習String物件不可能會釋出 common language runtime (CLR) 終止為止。 原因在於實習的 CLR 參考String物件可以保存您的應用程式或甚至是您應用程式定義域之後,會終止。 其次,若 intern 字串,您必須先建立字串。 所使用的記憶體String必須仍然即將配置給物件,即使記憶體會最後被記憶體回收。

.NET Framework 2.0 版導入了CompilationRelaxations.NoStringInterning列舉成員。 NoStringInterning成員標記為不需要字串常值實習組件。 您可以套用NoStringInterning使用組件CompilationRelaxationsAttribute屬性。 此外,當您使用Ngen.exe (Native Image Generator)編譯組件之前 執行階段,字串不實習跨模組。

下列範例會使用三個值來判斷新建立的字串是否相等的字串,並已經保留的字串相等。

// 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
*/

.NET Framework
自 1.1 起供應
Silverlight
自 2.0 起供應
Windows Phone Silverlight
自 7.0 起供應
回到頁首
顯示: