2009-09-04 13 views
3

MSDNはString.InternとString.IsInternedの違いは何ですか?

String.Internが

String.IsInternedが指定された文字列に 参照を取得し、指定された文字列にシステムの 参照を取得することを述べています。

私はIsInternedが、指定された文字列が保留されているかどうかを示すブールを返す必要があると思います。それは正しい考えですか?つまり、.netフレームワーク命名規則と少なくとも一貫していません。

Iは、次のコードを書いた:

string s = "PK"; 
    string k = "PK"; 

    Console.WriteLine("s has hashcode " + s.GetHashCode()); 
    Console.WriteLine("k has hashcode " + k.GetHashCode()); 
    Console.WriteLine("PK Interned " + string.Intern("PK")); 
    Console.WriteLine("PK IsInterned " + string.IsInterned("PK")); 

が出力される。

のハッシュコード-837830672

kはハッシュコード-837830672

PKインターンを有し有しますPK

PK IsInterned PK "PK" を返すなぜ( "PK")string.IsInternedさ

+1

あなたは、文字列の詳細についての詳細やインターンをお知りになりたい場合は私の答えを参照してください。この質問にはhttp://stackoverflow.com/questions/372547/where-do-java-and-net-string-literals-reside/372559#372559 –

+2

名前は非常に長いです。おそらく、それは "IfInterned"のタイプミスでした。 – Greg

+0

'GetHashCode'の使用に注意してください。' System.String'クラス*が* GetHashCode()をオーバーライドすることに注意してください。したがって、このようなメソッド呼び出しは、インスタンスが異なる可能性があるかどうかを確認するためには役に立ちません。代わりに 'using System.Runtime.CompilerServices;'ディレクティブを含め、 'RuntimeHelpers.GetHashCode(string)'を使用してください。これは良い例です: 'string s =" PK ";文字列t = 'P'.ToString()+ "K";コンソール。WriteLine( "sはオーバーライドされていないハッシュコードを持つ" + RuntimeHelpers.GetHashCode(s)); Console.WriteLine( "tはオーバーライドされていないハッシュコード" + RuntimeHelpers.GetHashCode(t)); '。 –

答えて

17

String.Intern internsまだ文字列が格納されていない場合は文字列。 String.IsInternedはありません。

IsInterned("PK")は、既にインターナショナルであるため「PK」を返しています。 boolの代わりに文字列を返す理由は、(文字列が渡されたのと同じ参照ではないかもしれない)内部文字列自体への参照を簡単に取得できるようにするためです。換言すれば、効果的に一度に情報の二つの関連部分を返します - あなたは簡単にboolを返すことをシミュレートすることができます。

public static bool IsInternedBool(string text) 
{ 
    return string.IsInterned(text) != null; 
} 

私は私がされているだろうかわからないが、命名は、理想的ではないことに同意しますより良い:GetInternedおそらく?ここで

は、しかし、その違いを示す例だ - 私は事前に抑留され、それらを避けるために、文字列リテラルを使用していないよ:

using System; 

class Test 
{ 
    static void Main() 
    { 
     string first = new string(new[] {'x'}); 
     string second = new string(new[] {'y'}); 

     string.Intern(first); // Interns it 
     Console.WriteLine(string.IsInterned(first) != null); // Check 

     string.IsInterned(second); // Doesn't intern it 
     Console.WriteLine(string.IsInterned(second) != null); // Check 
    } 
} 
+0

@Jon答えをありがとう。文字列sの宣言が "PK"を黙認していなければならないと考えるのは正しいですか? String.Intern( "PK")は何をしますか? –

+4

すべてのリテラル文字列は、デフォルトで使用できません。 –

+1

@ PKの場合、文字列が既にインターンされていれば、インターンは渡されたのと同じ参照を返します。リテラルが自動的にインターンされるという事実はわかりませんでしたが、完全に意味があります。 –

関連する問題