情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

String.Intern メソッド

2013/12/12

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

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public static string Intern(
	string str
)

パラメーター

str
型: System.String
インターン プールから検索する文字列。

戻り値

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

例外条件
ArgumentNullException

strnull です。

共通言語ランタイムは、インターン プールと呼ばれるテーブルを保持することで文字列のストレージを管理しています。このテーブルには、プログラム内で宣言または作成された一意のリテラル文字列に対する単一の参照が含まれています。この結果として、特定の値を持つリテラル文字列のインスタンスは、システムに 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);
outputBlock.Text += ((Object)s2 == (Object)s1) + "\n"; // Different references.
outputBlock.Text += ((Object)s3 == (Object)s1) + "\n"; // The same reference.


このメソッドと IsInterned メソッドを比較します。

3 つの同じ文字列を使用して、新たに作成した文字列と、インターン プールに格納された文字列の参照とが等価であるかどうかを確認するコード例を次に示します。


// Sample for String.Intern(String)
using System;
using System.Text;

class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      String s1 = "MyTest";
      String s2 = new StringBuilder().Append("My").Append("Test").ToString();
      String s3 = String.Intern(s2);
      outputBlock.Text += String.Format("s1 == '{0}'", s1) + "\n";
      outputBlock.Text += String.Format("s2 == '{0}'", s2) + "\n";
      outputBlock.Text += String.Format("s3 == '{0}'", s3) + "\n";
      outputBlock.Text += String.Format("Is s2 the same reference as s1?: {0}", (Object)s2 == (Object)s1) + "\n";
      outputBlock.Text += String.Format("Is s3 the same reference as s1?: {0}", (Object)s3 == (Object)s1) + "\n";
   }
}
/*
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
*/


Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示: