2011-06-21 12 views
9

Stringクラスには、方法IsInterned()があります。私はこの方法を使用しません。この方法の最高の使い方を理解するのを助けてください。String.IsInternedの目的は何ですか?

+2

msftの公式ドキュメントに満足していませんか? http://msdn.microsoft.com/en-us/library/system.string.isinterned.aspx – tzup

+5

@tzup:ドキュメントは、その機能を使用するときではなく、その機能を実行します。 – Gabe

答えて

3

文字列値をロックしたい場合は、1つの可能性があります。以下で

:同じ文字列のための2つの異なる要求がある場合がありますので

string s = //get it from somewhere, e.g. a web request 
lock (s){ 
//do something 
} 

は問題があるが、それらの両方が保護されたコードを入力してください。これは、同じ値を持つ2つの異なる文字列オブジェクトが存在する可能性があるためです。

しかし、intern poolと呼ばれるものがあります。これは、一部の文字列のインスタンスが1つ含まれているテーブルです(たとえば、すべてのリテラルがそこにあります)。

あなたは、ロックを機能させるためにそれを使用することができます:

string s = //get it from somewhere, e.g. a web request 
lock (string.Intern(s)){ 
//do something 
} 

この関数をSと同じ値を持つインターンプール、文字列への参照を返しますので、ロックのために安全です。

関数IsInternは、保持している参照がインラインプール上の文字列への参照かどうかを単純にチェックします。

+6

文字列をロックしないでください。文字列はドメインの敏捷性があります。つまり、同じ文字列インスタンスが複数のappdomainからアクセスできる場合があります。その結果、1つのスレッドが関連のないappdomain ...でロックが解放されるのを待っている可能性があります。 – MaLio

+0

string.Internをロックするとロックが結合されます! – usr

1

C#の文字列リテラルは、リテラルが1つしか存在しないため、 が存在するように、インターネットされます(つまり、それらはインターネットプールに格納されます)。 言語(たとえば、スクリプトシステムなど)を作成する場合は、IsInternedとInternを使用して同じことを とすることができます。

2

Ericのポストを参照してください、私はこれは

+3

文字列「IsInterned」はその記事には表示されません。 – usr

0

thisを見てください説明されているインターンで最高だと思います。実際にはそのスレッドにユースケースがあります。

7

インターナショナルが最適化であると考えてください。それは他のものの増加のためにいくつかの望ましい資質の低下を取引する。特に、インターンは次のような優れた性質を持っています。

  1. 重複する文字列ではメモリが無駄になりません。
  2. 両者が知り合っていることが分かっている文字列の比較は非常に高速です。
  3. 保留されている文字列間の等価比較は、保留されていない場合よりもずっと高速です。
  4. 場合によっては、他の比較によってパフォーマンスが向上します。

それは、次の悪い特質を持っています

  1. 文字列は、ごみは、多くの場合、(もし全てで)として収集されていない、再利用することができ、メモリが再び見たことがないされている文字列で使用されているので、またはのためにとても長い間。 (あなたのすべての文字列をインターンし、あなたは本当に厄介なメモリの使用に終わる可能性があります)。

最適化として、良質のものが悪いものか悪いものかが分からない場合に使用します(文字列がアプリケーションの存続期間中存続することがわかっている場合)とにかく、またはそれが何回も使用されることを知っていれば、悪い部分は保持されません)。

そして、悪い性質が財の価値を上げる場所では使用しません。 (ほとんどの時間)。

IsInterned()パートウェイポイントを見つけるために使用できます。

public string Name { get; set; } 

するのは、私はそれが与えられたNameを持つオブジェクトを探すために、または多くのことを行うのと同じNameでオブジェクトを検索しようとか、そうでないのが一般的だということを知っているとしましょう:

は、私は、文字列プロパティ Nameを持って考えてみましょうその上の平等比較のまたは、同じ Nameのオブジェクトがたくさんあることがわかっているとします。または両方。私はインターンを検討するかもしれないこれらのケースでは

:もちろん

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set { _name = string.Intern(value); } 
} 

、これは良いアイデアだったかどうかは、上記のインターンの良い点、悪い品質に依存します。イン間使用していない使用して

は可能性である:ここでは

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set { _name = string.IsInterned(value) ?? value; } 
} 

文字列valueがすでにinternされている場合、我々はインターンのダウンサイドは仕事で既にあり、私たちはこれ以上苦しむことはありませんそれで、我々はそれを利用する。しかし、もしvalueがまだ保留されていなければ、それをそのまま使用します。

これは最適化でもあり、異なる場合に最適化します。合理的な数の値が他のコードによって(またはアセンブリ内のリテラルと一致するために)拘束される可能性が高い場合にのみ役立ちます。そうでなければ、ルックアップの時間が浪費されます。おそらく、文字列を使用してインターンを無視するよりもあまり有用ではない場合がありますが、有用である可能性のある時間が表示されるのは、Intern()よりも有用性は低いでしょう。

関連する問題