String.IsInterned(String) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
指定した Stringへの参照を取得します。
public:
static System::String ^ IsInterned(System::String ^ str);
public static string? IsInterned(string str);
public static string IsInterned(string str);
static member IsInterned : string -> string
Public Shared Function IsInterned (str As String) As String
パラメーター
- str
- String
インターン プール内で検索する文字列。
返品
共通言語ランタイム のインターン プール内にある場合は str への参照。それ以外の場合は null。
例外
str は nullです。
例
次の例では、 IsInterned を使用して、文字列がインターン プール内にあるかどうかを確認し、インターン文字列の参照の等価性を確認する方法を示します。
// Sample for String.IsInterned(String)
using System;
using System.Text;
class Sample
{
public static void Main()
{
// Constructed strings are not automatically interned.
string s1 = new StringBuilder().Append("My").Append("Test").ToString();
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
// Neither string is in the intern pool yet.
Console.WriteLine($"Is s1 interned? {String.IsInterned(s1) != null}");
Console.WriteLine($"Is s2 interned? {String.IsInterned(s2) != null}");
// Intern s1 explicitly.
string i1 = String.Intern(s1);
// Now s2 can be found in the intern pool.
string i2 = String.IsInterned(s2);
Console.WriteLine($"Is s2 interned after interning s1? {i2 != null}");
Console.WriteLine($"Are i1 and i2 the same reference? {Object.ReferenceEquals(i1, i2)}");
}
}
// This example produces the following results:
//
// Is s1 interned? False
// Is s2 interned? False
// Is s2 interned after interning s1? True
// Are i1 and i2 the same reference? True
// Sample for String.IsInterned(String)
open System
open System.Text
// Constructed strings are not automatically interned.
let s1 = StringBuilder().Append("My").Append("Test").ToString()
let s2 = StringBuilder().Append("My").Append("Test").ToString()
// Neither string is in the intern pool yet.
printfn $"Is s1 interned? {String.IsInterned(s1) <> null}"
printfn $"Is s2 interned? {String.IsInterned(s2) <> null}"
// Intern s1 explicitly.
let i1 = String.Intern(s1)
// Now s2 can be found in the intern pool.
let i2 = String.IsInterned(s2)
printfn $"Is s2 interned after interning s1? {i2 <> null}"
printfn $"Are i1 and i2 the same reference? {Object.ReferenceEquals(i1, i2)}"
// This example produces the following results:
//
// Is s1 interned? False
// Is s2 interned? False
// Is s2 interned after interning s1? True
// Are i1 and i2 the same reference? True
' Constructed strings are not automatically interned.
Dim s1 As String = New StringBuilder().Append("My").Append("Test").ToString()
Dim s2 As String = New StringBuilder().Append("My").Append("Test").ToString()
' Neither string is in the intern pool yet.
Console.WriteLine($"Is s1 interned? {String.IsInterned(s1) IsNot Nothing}")
Console.WriteLine($"Is s2 interned? {String.IsInterned(s2) IsNot Nothing}")
' Intern s1 explicitly.
Dim i1 As String = String.Intern(s1)
' Now s2 can be found in the intern pool.
Dim i2 As String = String.IsInterned(s2)
Console.WriteLine($"Is s2 interned after interning s1? {i2 IsNot Nothing}")
Console.WriteLine($"Are i1 and i2 the same reference? {Object.ReferenceEquals(i1, i2)}")
' This example produces the following results:
'
' Is s1 interned? False
' Is s2 interned? False
' Is s2 interned after interning s1? True
' Are i1 and i2 the same reference? True
注釈
共通言語ランタイムは、プログラムで宣言された各一意のリテラル文字列定数の 1 つのインスタンスと、String メソッドを呼び出してプログラムで追加するInternの一意のインスタンスを含む、インターン プールと呼ばれるテーブルを自動的に保持します。
インターン プールは文字列ストレージを節約します。 リテラル文字列定数を複数の変数に割り当てると、各変数は、同じ値を持つ String の複数の異なるインスタンスを参照するのではなく、インターン プール内の同じ定数を参照するように設定されます。
このメソッドは、インターン プール内の str を検索します。
strが既にインターンされている場合は、そのインスタンスへの参照が返されます。それ以外の場合は、nullが返されます。
このメソッドを Intern メソッドと比較します。
このメソッドはブール値を返しません。 特定の文字列がインターンされているかどうかを示すブール値が必要であるためにメソッドを呼び出す場合は、次のようなコードを使用できます。
using System;
public class Example
{
public static void Main()
{
string str1 = "a";
string str2 = str1 + "b";
string str3 = str2 + "c";
string[] strings = { "value", "part1" + "_" + "part2", str3,
String.Empty, null };
foreach (var value in strings) {
if (value == null) continue;
bool interned = String.IsInterned(value) != null;
if (interned)
Console.WriteLine("'{0}' is in the string intern pool.",
value);
else
Console.WriteLine("'{0}' is not in the string intern pool.",
value);
}
}
}
// The example displays the following output:
// 'value' is in the string intern pool.
// 'part1_part2' is in the string intern pool.
// 'abc' is not in the string intern pool.
// '' is in the string intern pool.
open System
let str1 = "a"
let str2 = str1 + "b"
let str3 = str2 + "c"
let strings =
[| "value"; "part1" + "_" + "part2"; str3
String.Empty; null |]
for value in strings do
if value <> null then
let interned = String.IsInterned(value) <> null
if interned then
printfn $"'{value}' is in the string intern pool."
else
printfn $"'{value}' is not in the string intern pool."
// The example displays the following output:
// 'value' is in the string intern pool.
// 'part1_part2' is in the string intern pool.
// 'abc' is not in the string intern pool.
// '' is in the string intern pool.
Dim str1 As String = "a"
Dim str2 As String = str1 + "b"
Dim str3 As String = str2 + "c"
Dim strings() As String = {"value", "part1" + "_" + "part2", str3,
String.Empty, Nothing}
For Each value In strings
If value Is Nothing Then Continue For
Dim interned As Boolean = (String.IsInterned(value) IsNot Nothing)
If interned Then
Console.WriteLine($"'{value}' is in the string intern pool.")
Else
Console.WriteLine($"'{value}' is not in the string intern pool.")
End If
Next
' The example displays the following output:
' 'value' is in the string intern pool.
' 'part1_part2' is in the string intern pool.
' 'abc' is not in the string intern pool.
' '' is in the string intern pool.