String.Intern メソッド
指定した String へのシステム参照を取得します。
Public Shared Function Intern( _
ByVal str As String _) As String
[C#]
public static string Intern(stringstr);
[C++]
public: static String* Intern(String* str);
[JScript]
public static function Intern(
str : String) : String;
パラメータ
- str
String 。
戻り値
str の値が既にインターン プールに存在する場合は、システムの参照が返されます。それ以外の場合は、 str の値を持つ文字列への新しい参照が返されます。
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | str が null 参照 (Visual Basic では Nothing) です。 |
解説
共通言語ランタイムは、インターン プールと呼ばれるテーブルを保持することで文字列のストレージを管理しています。このテーブルには、プログラム内で宣言または作成された一意のリテラル文字列に対する単一の参照が含まれています。この結果として、特定の値を持つリテラル文字列のインスタンスは、システムに 1 つしか存在しません。
たとえば、いくつかの変数に同じリテラル文字列を代入した場合、ランタイムはそのリテラル文字列に対する同じ参照をインターン プールから取得して、それぞれの変数に代入します。
Intern メソッドは、インターン プールを使用して、 str の値と等しい文字列を検索します。そのような文字列が存在する場合は、インターン プール内の該当する参照が返されます。文字列が存在しない場合は、 str への参照がインターン プールに追加された後、その参照が返されます。
次の C# の例では、"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 メソッドを比較します。
使用例
' Sample for String.Intern(String)
Imports System
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 = '{0}'", s1)
Console.WriteLine("s2 = '{0}'", s2)
Console.WriteLine("s3 = '{0}'", s3)
Console.WriteLine("Is s2 the same reference as s1?: {0}", s2 Is s1)
Console.WriteLine("Is s3 the same reference as s1?: {0}", s3 Is s1)
End Sub 'Main
End Class 'Sample
'
's1 = 'MyTest'
's2 = 'MyTest'
's3 = 'MyTest'
'Is s2 the same reference as s1?: False
'Is s3 the same reference as s1?: True
'
[C#]
// 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
*/
[C++]
// Sample for String::Intern(String)
#using <mscorlib.dll>
using namespace System;
using namespace System::Text;
int main() {
String* s1 = S"MyTest";
String* s2 = (new StringBuilder())->Append(S"My")->Append(S"Test")->ToString();
String* s3 = String::Intern(s2);
Console::WriteLine(S"s1 == '{0}'", s1);
Console::WriteLine(S"s2 == '{0}'", s2);
Console::WriteLine(S"s3 == '{0}'", s3);
Console::WriteLine(S"Is s2 the same reference as s1?: {0}", __box(s2==s1));
Console::WriteLine(S"Is s3 the same reference as s1?: {0}", __box(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
*/
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard