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

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

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が等しくないです。

メモリの総量を削減しようとしている場合、アプリケーションを割り当てます、ある文字列がインターン処理 2 つの望ましくない副作用に注意してください。 最初に、割り当てられたメモリ インターンのStringオブジェクトは可能性がありますするまで解放されません、共通言語ランタイム (CLR) を終了します。 その理由は、インターンへの参照を CLR のStringオブジェクトは、アプリケーションまたはアプリケーション ドメインも後に永続化できる、終了します。 次に、文字列をインターン プールには、文字列を最初作成する必要があります。 によって使用されるメモリ、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 以降で使用可能
トップに戻る
表示: