String.Intern(String) String.Intern(String) String.Intern(String) String.Intern(String) Method

定義

指定した String へのシステム参照を取得します。Retrieves the system's reference to the specified String.

public:
 static System::String ^ Intern(System::String ^ str);
public static string Intern (string str);
static member Intern : string -> string
Public Shared Function Intern (str As String) As String

パラメーター

str
String String String String

インターン プールから検索する文字列。A string to search for in the intern pool.

戻り値

str がインターン プールに存在する場合は、それに対するシステム参照。それ以外の場合は、値が str の文字列への新しい参照。The system's reference to str, if it is interned; otherwise, a new reference to a string with the value of str.

例外

次の例では、値が等しい3つの文字列を使用して、新しく作成された文字列とインターンされた文字列が等しいかどうかを判断します。The following example uses three strings that are equal in value to determine whether a newly created string and an interned string are equal.

// Sample for String::Intern(String)
using namespace System;
using namespace System::Text;
int main()
{
   String^ s1 = "MyTest";
   String^ s2 = (gcnew 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}", s2 == s1 );
   Console::WriteLine( "Is s3 the same reference as s1?: {0}", s3 == 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
*/
// 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 == {s1}");
        Console.WriteLine($"s2 == {s2}");
        Console.WriteLine($"s3 == {s3}");
        Console.WriteLine($"Is s2 the same reference as s1?: {(Object)s2 == (Object)s1}"); 
        Console.WriteLine($"Is s3 the same reference as s1?: {(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
*/
Imports System.Text

Class Sample

    Public Shared Sub Main()
        Dim s1 As String = "MyTest"
        Dim s2 As String = New StringBuilder().Append("My").Append("Test").ToString()
        Dim s3 As String = String.Intern(s2)
        Console.WriteLine($"s1 = {s1}")
        Console.WriteLine($"s2 = {s2}")
        Console.WriteLine($"s3 = {s3}")
        Console.WriteLine($"Is s2 the same reference as s1?: {s2 Is s1}")
        Console.WriteLine($"Is s3 the same reference as s1?: {s3 Is s1}")
    End Sub
End Class
'
's1 = MyTest
's2 = MyTest
's3 = MyTest
'Is s2 the same reference as s1?: False
'Is s3 the same reference as s1?: True
'

注釈

共通言語ランタイムは、インターンプールと呼ばれるテーブルを保持することによって文字列ストレージを節約します。このテーブルには、プログラムで宣言またはプログラムによって作成された一意のリテラル文字列への単一の参照が含まれています。The common language runtime conserves string storage by maintaining a table, called the intern pool, that contains a single reference to each unique literal string declared or created programmatically in your program. その結果、特定の値を持つリテラル文字列のインスタンスは、システム内に1回だけ存在します。Consequently, an instance of a literal string with a particular value only exists once in the system.

たとえば、同じリテラル文字列を複数の変数に割り当てた場合、ランタイムは、インターンプールからリテラル文字列への同じ参照を取得し、各変数に代入します。For example, if you assign the same literal string to several variables, the runtime retrieves the same reference to the literal string from the intern pool and assigns it to each variable.

メソッドInternは、インターンプールを使用して、のstr値と等しい文字列を検索します。The Intern method uses the intern pool to search for a string equal to the value of str. このような文字列が存在する場合は、インターンプール内のその参照が返されます。If such a string exists, its reference in the intern pool is returned. 文字列が存在しない場合は、へstrの参照がインターンプールに追加され、その参照が返されます。If the string does not exist, a reference to str is added to the intern pool, then that reference is returned.

次の例では、値が "MyTest" の文字列 s1 は、プログラム内のリテラルであるため、既にインターンされています。In the following example, the string s1, which has a value of "MyTest", is already interned because it is a literal in the program. クラスSystem.Text.StringBuilderは、s1 と同じ値を持つ新しい文字列オブジェクトを生成します。The System.Text.StringBuilder class generates a new string object that has the same value as s1. その文字列への参照が s2 に割り当てられます。A reference to that string is assigned to s2. メソッドInternは、s2 と同じ値を持つ文字列を検索します。The Intern method searches for a string that has the same value as s2. このような文字列が存在するので、このメソッドは s1 に割り当てられているのと同じ参照を返します。Because such a string exists, the method returns the same reference that is assigned to s1. その後、その参照が s3 に割り当てられます。That reference is then assigned to s3. 参照 s1 と s2 は異なるオブジェクトを参照しているため、等しくないと比較します。参照 s1 と s3 は同じ文字列を参照しているため、等しいと比較されます。References s1 and s2 compare unequal because they refer to different objects; references s1 and s3 compare equal because they refer to the same string.

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.
Dim s1 As String = "MyTest" 
Dim s2 As String = New StringBuilder().Append("My").Append("Test").ToString() 
Dim s3 As String = String.Intern(s2) 
Console.WriteLine(CObj(s2) Is CObj(s1))      ' Different references.
Console.WriteLine(CObj(s3) Is CObj(s1))      ' The same reference.

このメソッドとIsInternedメソッドを比較します。Compare this method to the IsInterned method.

バージョンに関する考慮事項Version Considerations

では、メソッドInternは、空の文字列をインターン処理することに関して、.NET Framework 1.0 および1.1 での動作に戻ります。 .NET Framework 3.5 Service Pack 1.NET Framework 3.5 Service Pack 1In the .NET Framework 3.5 Service Pack 1.NET Framework 3.5 Service Pack 1, the Intern method reverts to its behavior in the .NET Framework 1.0 and 1.1 with regard to interning the empty string. 次の例では、変数str1にへEmptyの参照が割り当てられ、 str2変数には、 Empty Intern StringBuilderを変換した後にメソッドを呼び出すことによって返されるへの参照が割り当てられています。値がEmpty文字列であるオブジェクト。In the following example, the variable str1 is assigned a reference to Empty, and the variable str2 is assigned the reference to Empty that is returned by calling the Intern method after converting a StringBuilder object whose value is Empty to a string. 次に、にstr1 str2含まれる参照が等しいかどうかを比較します。Then the references contained in str1 and str2 are compared for equality.

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.");
Dim str1 As String = String.Empty
Dim str2 As String = String.Empty

Dim sb As StringBuilder = New StringBuilder().Append(String.Empty)
str2 = String.Intern(sb.ToString())	

If CObj(str1) Is CObj(str2) Then
    Console.WriteLine("The strings are equal.")
Else
    Console.WriteLine("The strings are not equal.")
End If	

.NET Framework 1.0.NET Framework 1.0 、、.NET Framework 3.5 SP1.NET Framework 3.5 SP1およびでは、 str1str2は等価です。 .NET Framework 1.1.NET Framework 1.1In the .NET Framework 1.0.NET Framework 1.0, .NET Framework 1.1.NET Framework 1.1, and .NET Framework 3.5 SP1.NET Framework 3.5 SP1, str1 and str2 are equal. とでは、str1str2は等しくありません。 .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1 .NET Framework 3.0.NET Framework 3.0In the .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1 and .NET Framework 3.0.NET Framework 3.0, str1 and str2 are not equal.

パフォーマンスに関する考慮事項Performance Considerations

アプリケーションによって割り当てられるメモリの総量を減らす場合は、インターン文字列に2つの望ましくない副作用があることに注意してください。If you are trying to reduce the total amount of memory your application allocates, keep in mind that interning a string has two unwanted side effects. 1つ目の方法としStringて、インターン解除されたオブジェクトに割り当てられるメモリは、共通言語ランタイム (CLR) が終了するまで解放されない可能性があります。First, the memory allocated for interned String objects is not likely to be released until the common language runtime (CLR) terminates. その理由は、インターンString化されたオブジェクトへの CLR の参照は、アプリケーションまたはアプリケーションドメインが終了した後も保持される可能性があるためです。The reason is that the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates. 次に、文字列をインターンさせるには、最初に文字列を作成する必要があります。Second, to intern a string, you must first create the string. メモリが最終的にガベージStringコレクトされる場合でも、オブジェクトによって使用されるメモリを割り当てる必要があります。The memory used by the String object must still be allocated, even though the memory will eventually be garbage collected.

.NET Framework バージョン2.0 では、 CompilationRelaxations.NoStringInterning列挙型のメンバーが導入されています。The .NET Framework version 2.0 introduces the CompilationRelaxations.NoStringInterning enumeration member. メンバー NoStringInterningは、アセンブリをリテラル文字列インターンを必要としないものとしてマークします。The NoStringInterning member marks an assembly as not requiring string-literal interning. 属性CompilationRelaxationsAttributeを使用NoStringInterningしてアセンブリにを適用できます。You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute. また、 ngen.exe (ネイティブイメージジェネレーター)を使用して、実行時より前にアセンブリをコンパイルする場合、文字列はモジュール間でインターンプールされません。Also, when you use the Ngen.exe (Native Image Generator) to compile an assembly in advance of run time, strings are not interned across modules.

適用対象

こちらもご覧ください