この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

String.Intern メソッド (String)

 

公開日: 2016年10月

指定した String へのシステム参照を取得します。

名前空間:   System
アセンブリ:  mscorlib (mscorlib.dll 内)

public static string Intern(
	string str
)

パラメーター

str
Type: System.String

インターン プールから検索する文字列。

戻り値

Type: System.String

str がインターン プールに存在する場合は、それに対するシステム参照。それ以外の場合は、値が str の文字列への新しい参照。

Exception Condition
ArgumentNullException

strnull です。

共通言語ランタイムは、それぞれ一意のリテラル文字列宣言するか、プログラムでプログラムを使用して作成する 1 つの参照を含んでいるインターン プールと呼ばれる、テーブルを保持することによって文字列ストレージを節約できます。 その結果、特定の値を表すリテラル文字列のインスタンスのみ 1 回、システムに存在します。

などのいくつかの変数に同じリテラル文字列を割り当てる場合、ランタイムはインターン プールからのリテラル文字列を同じ参照を取得し、各変数に代入します。

Intern メソッドを使用して、インターン プール検索文字列の値と等しい strします。 このような文字列が存在する場合のインターン プール内の参照が返されます。 文字列が存在しないかどうかへの参照を str 、その参照が返されますが、インターン プールに追加します。

次の例では、"MyTest"の値を持つ文字列 s1 がインターンされるは、プログラム内のリテラルであるために既にです。 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.");

.NET Framework 1.0, 、.NET Framework 1.1, 、および .NET Framework 3.5 SP1, 、str1str2 が等しい。  .NET Framework 2.0 Service Pack 1 と .NET Framework 3.0, 、str1str2 が等しくないです。

メモリの総量を削減しようとしている場合は、アプリケーションによって確保、文字列インターンの使用を 2 つの望ましくない副作用を持つことに留意してください。 インターンの最初に、メモリに割り当てられた String オブジェクトは、おそらくが解放されない共通言語ランタイム (CLR) が終了するまでです。 その理由は、隔離されたへの参照を CLR の String オブジェクトは、アプリケーションまたはアプリケーション ドメインも後に永続化できる、終了します。 第 2 に、文字列をインターン プールには、文字列を最初に作成する必要があります。 によって使用されるメモリ、 String オブジェクト必要があります割り当てられたままに、ガベージ コレクションが最終的にすると、メモリです。

.NET Framework version 2.0 では、 CompilationRelaxations.NoStringInterning列挙体のメンバーです。 NoStringInterning メンバーは、リテラル文字列インターンの使用を必要としないとしてアセンブリをマークします。 適用できる NoStringInterning を使用してアセンブリを CompilationRelaxationsAttribute 属性です。 また、使用、 Ngen.exe (ネイティブ イメージ ジェネレーター) 文字列をいないモジュール間でインターンを実行時を前もってお客様にアセンブリをコンパイルします。

次のコードの例では、3 つの文字列は、新しく作成された文字列かどうかを決定する値に等しいとインターンの文字列が等しい。

// 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 以降で使用可能
トップに戻る
表示: