文字列オブジェクトに割り当てるときに「」の上にstring.Emptyを使用する理由


13

コードに対してStyleCopを実行していますが、SA1122の推奨事項の1つは、空の文字列を値に割り当てるときに ""ではなくstring.Emptyを使用することです。

私の質問は、これがベストプラクティスと見なされる理由です。または、これはベストプラクティスと見なされますか?私は2つのステートメントの間にコンパイラの違いがないと仮定しているので、それは読みやすいものだと思うことができますか?

質問と回答

ジョン・スキートの質問への回答


5
Stack Overflowでこれが尋ねられて答えられたと確信していますが、見つけるのに苦労しています。それはのための新しい文字列オブジェクトをインスタンス化するために持っているという事実に関係するのです""が、ではないstring.Empty
ChrisF

@ChrisFああ、このタイプの質問ではスタックオーバーフローを調べるとは思わなかった。ガンダーがあります。
dreza


@ChrisF-SOで質問されました。オーバーオーバーオーバー ...
オデッド

1
ここでは行く- stackoverflow.com/questions/151472/...を - 2008年9月からバック
ChrisF

回答:


12

正当な理由の1つは、これがタイプミスやプレースホルダーではなく、ここで空の文字列を実際に使用することを明確にしたことです。

「ベストプラクティス」と見なされるかどうかはわかりません。


7

2つの理由があると思います。1つは読みやすさで、もう2つはパフォーマンスが少し向上するからです。

読みやすさは簡単です:を見つけるstring.Emptyよりもはるかに高速です""string.Empty一般に、文字列を検索するよりも、文字列を検索する方が簡単で、おそらくより正確です。また、意図を明確にします。タイプミスをしたり、何かを忘れるだけでなく、本当に空の文字列が必要でした。

パフォーマンスの理由は、実習によるものです。ランタイムは、以前に使用された文字列のテーブルを保持しているため、実際に文字ごとのチェックを行うことなく、文字列比較をすばやく実行できます。 リテラルを入力するとインターンされたバージョンが得られない可能性string.Emptyがあるため、すでにインターンされた""場所への参照です。したがって、パフォーマンスがわずかに低下します。


7
1つは、少なくとも.Net 2以降では、リテラル ""を入力すると、常に同じ ""のインターンバージョンが提供されます。
クエンティン・スターリン

確かに、MSDNの実習記事は、その点について理解するのが少し難しいです。""とstringのように見えます。Emptyは両方とも同じインターンされた文字列を指すはずですが、.netランタイムバージョン間のいくつかの違いを示しているようです。コード内で複数回出現する文字列リテラルは、2番目以降の使用時にインターンされると思いますか?
CodexArcanum

4
また、私がわずかに言うとき、私は超極小を意味することを強調しなければなりません。「パフォーマンスのため」は、ある表現から別の表現に切り替える理由ではなく、ランタイムについて知っておくだけの価値のあるものです。
CodexArcanum

4
また、パフォーマンスの側面はコンパイルにのみ当てはまることにも注意してください。両方が同じILにコンパイルされるため、実行時のパフォーマンスは同じになります。
lzcd

そのパフォーマンスの向上はコンパイル時のみになります
ラチェットフリーク


0

私が見つけたいくつかのドキュメントによると、それはコンパイラーによって出力されるものに関係しています。

クイック検索で明らかになります:http : //stylecop.soyuz5.com/SA1122.html

その説明と共に「読みやすさのルール」の下に提出された理由は不可解です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.