web-dev-qa-db-ja.com

string.empty vs null。どちらを使用しますか?

最近、職場の同僚からstring.Empty文字列変数を設定するときに、スタックを汚染するときにnullを使用しますか?

彼は言うな

string myString=string.Empty;ただし、string mystring=null;

それは本当に重要ですか?文字列はオブジェクトであることがわかっているので、それは一種の理にかなっています。

馬鹿げた質問ですが、あなたの見解は何ですか?

79
user712923

nullEmptyは非常に異なるため、これらを任意に切り替えることはお勧めしません。ただし、Emptyは単一の固定参照であるため、余分な「コスト」はありません(何度でも使用できます)。

ldsfld に起因するスタック上の「汚染」はありません-その懸念は....クレイジーです。 nullのロードはほぼ間違いなくmarginally安価ですが、null参照例外を引き起こす可能性があります値のチェックに注意を払っていない場合。

個人的には、どちらも使用しません...空の文字列が必要な場合は、""を使用します-シンプルで明白です。インターンとは、このalsoにも使用ごとのオーバーヘッドがないことを意味します。


ILレベルでは、 ""とEmptyの違いはldstrとldsfldだけですが、どちらも同じ単一のインターン文字列参照を提供します。さらに、最新の.NETバージョンでは、JITはこれらを直接インターセプトし、実際に静的フィールドルックアップを行う空の文字列参照withoutを生成します。基本的に、読みやすさを除いて、どちらの方法でも注意する理由はまったくありません。 「」を使用しています。

102
Marc Gravell

「スタックを汚染する」ことはありません。技術的な理由はありませんが、オブジェクトへの参照に変数を設定すること(空の文字列であっても)とnullには大きな違いがあります。それらは同じものではなく、異なる方法で使用する必要があります。

nullは、データがないことを示すために使用する必要があります、string.Empty (または "")データの存在、実際には空のテキストを示します。最も適切なものがわからない特定のケースはありますか?

編集し、例を追加しました:

  • string.Empty人の名前のデフォルトの接尾辞として(たとえば、ほとんどの人は博士号を持っていません)

  • 構成ファイルで指定されていない構成オプションには、nullを使用できます。この場合、 string.Emptyは、構成オプションが存在する場合に使用されますが、目的の構成値は空の文字列でした。

28

他の人がすでに答えているように、彼らは異なっています。

static void Main(string[] args)
{
    string s1 = null;
    string s2 = string.Empty;
    string s3 = "";
    Console.WriteLine(s1 == s2);
    Console.WriteLine(s1 == s3);
    Console.WriteLine(s2 == s3);
}

 results:
 false     - since null is different from string.empty
 false     - since null is different from ""
 true      - since "" is same as string.empty

空の文字列と空の文字列を管理する問題は、フラットファイルに永続化するか、通信で転送する必要がある場合に問題になります。したがって、このページにアクセスして、その特定の問題。

文字列をファイルまたは通信に保存する目的:
おそらく文字列をバイトに変換するでしょう。
2つのセグメントのヘッダーバイトを変換後の文字列に追加することをお勧めします。

セグメント1-1バイトで保存され、次のセグメントの長さを記述するメタ情報。

セグメント2-保存する文字列の長さを保持します。

例:
string "abcd"-簡略化するためにASCIIエンコーダーを使用して変換し、{65,66,67,68}を取得します。
計算セグメント2は4を生成します。したがって、4バイトは変換された文字列の長さです。
セグメント1を計算すると1が得られます-変換された文字列情報の長さ情報を保持するために1バイトのみが使用されたため(4でした。つまり、260だった場合は2になります)

新しいバイトストライプは{1,4,65,66,67,68}になり、ファイルに保存できます。

サブジェクトに関する利点は、保存する空の文字列がある場合、長さ0のバイトの空の配列を変換から取得し、セグメントを計算した後、最終的に{1,0}になることです保存され、後でロードされ、空の文字列に戻されて解釈されます。一方、文字列にnull値が含まれていた場合、保存するバイト配列として{0}だけが含まれることになり、ロードされたときに再びnullとして解釈されます。

複数の文字列をジャグする場合、ロードまたは蓄積するサイズを知るなど、より多くの利点があります。

件名に戻る-それは、説明されている同じプリンシパルがヌルを空と区別するためにシステムで使用されているので、スタックを汚染します。そのため、文字列は空です。それを汚染と呼びます。

8
G.Y

死に対して答えられていますが、nullは値がなく、初期化されていないことを意味します。 string.Emptyは、MSDNに記載されているとおり、 ""(空の文字列)を意味します。

空またはnull文字列をチェックする最も安全な方法は、string.IsNullOrEmptyを使用することです。

1