String
クラスには、方法IsInterned()
があります。私はこの方法を使用しません。この方法の最高の使い方を理解するのを助けてください。String.IsInternedの目的は何ですか?
答えて
文字列値をロックしたい場合は、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
は、保持している参照がインラインプール上の文字列への参照かどうかを単純にチェックします。
C#の文字列リテラルは、リテラルが1つしか存在しないため、 が存在するように、インターネットされます(つまり、それらはインターネットプールに格納されます)。 言語(たとえば、スクリプトシステムなど)を作成する場合は、IsInternedとInternを使用して同じことを とすることができます。
がthisを見てください説明されているインターンで最高だと思います。実際にはそのスレッドにユースケースがあります。
インターナショナルが最適化であると考えてください。それは他のものの増加のためにいくつかの望ましい資質の低下を取引する。特に、インターンは次のような優れた性質を持っています。
- 重複する文字列ではメモリが無駄になりません。
- 両者が知り合っていることが分かっている文字列の比較は非常に高速です。
- 保留されている文字列間の等価比較は、保留されていない場合よりもずっと高速です。
- 場合によっては、他の比較によってパフォーマンスが向上します。
それは、次の悪い特質を持っています
- 文字列は、ごみは、多くの場合、(もし全てで)として収集されていない、再利用することができ、メモリが再び見たことがないされている文字列で使用されているので、またはのためにとても長い間。 (あなたのすべての文字列をインターンし、あなたは本当に厄介なメモリの使用に終わる可能性があります)。
最適化として、良質のものが悪いものか悪いものかが分からない場合に使用します(文字列がアプリケーションの存続期間中存続することがわかっている場合)とにかく、またはそれが何回も使用されることを知っていれば、悪い部分は保持されません)。
そして、悪い性質が財の価値を上げる場所では使用しません。 (ほとんどの時間)。
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()
よりも有用性は低いでしょう。
- 1. String.InternとString.IsInternedの違いは何ですか?
- 2. 静的な目的は何ですか?
- 3. Mongoclientとは何ですか?その目的は何ですか?
- 4. Ember.Containerの目的は何ですか
- 5. マーカーインターフェイスの目的は何ですか?
- 6. jquery.mobile.structureの目的は何ですか?
- 7. オペレータ "^"の目的は何ですか?
- 8. AccountManager(アンドロイド)の目的は何ですか?
- 9. SetDefaultFieldSortScoringの目的は何ですか?
- 10. Dockerビルドコンテキストの目的は何ですか?
- 11. Newtonsoft.Json.JsonToken.StartConstructorトークンの目的は何ですか?
- 12. SDL_opengl_glext.hの目的は何ですか?
- 13. Expressionクラスの目的は何ですか?
- 14. Control.GetPreferredSizeメソッドの目的は何ですか?
- 15. durandalの目的は何ですか?
- 16. Ember.js - Ember.lookupの目的は何ですか
- 17. IEnumeratorの目的は何ですか
- 18. `__metaclass__ = type`の目的は何ですか?
- 19. デルファイ:icontentの目的は何ですか?
- 20. ApplicationBuilder.Propertiesの目的は何ですか?
- 21. EasyMock.andVoid()の目的は何ですか?
- 22. PHPロギングフレームワークの目的は何ですか?
- 23. ボイドキャストの目的は何ですか?
- 24. グント:cwdの目的は何ですか?
- 25. データセットの目的は何ですか?
- 26. React-Router:IndexRouteの目的は何ですか?
- 27. Objects.compare()メソッドの目的は何ですか?
- 28. QTPLUGIN、その目的は何ですか?
- 29. VisitorIdentificationコントロールの目的は何ですか?
- 30. ErrorKindの目的は何ですか?
msftの公式ドキュメントに満足していませんか? http://msdn.microsoft.com/en-us/library/system.string.isinterned.aspx – tzup
@tzup:ドキュメントは、その機能を使用するときではなく、その機能を実行します。 – Gabe