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


84

最近、職場の同僚が私に使用しないように言った string.Empty、文字列変数を設定ときnull、スタックを汚染とき。

彼はしないでくださいと言います

string myString=string.Empty; しかし、します string mystring=null;

それは本当に重要ですか?文字列はオブジェクトであることを知っているので、それはある意味意味があります。

ばかげた質問だと思いますが、あなたの見解は何ですか?


1
なぜあなたがどちらかをするのか完全にはわかりません...あなたが例として議論していたコードをもう少し挙げていただけますか?
stusmith 2011

コードはありません。同僚にデバッグ中のものを確認するように依頼しました。彼は、原則として「string.emptyを使用しないでください」と言ってスタックに追加するときにnullに設定しました。個人的には常にstring.Emptyを使用していました。それが出た時は「」よりも使うのが正しいはずだったので。
user712923 2011


私は何を意味しています...でstring.Empty""、およびnullすべての定数値ですが、彼らはあなたが変数に1を代入したい理由は、私が見ることができないすべての「シンプル」は十分です。out変数をキャプチャする必要がある場合は、単に使用しないのはなぜstring myString;ですか?
stusmith 2011

8
最近では、読みやすさやセマンティクスに焦点を当てておらず、不条理なマイクロ最適化に焦点を当てているこのようなトピックに関する議論は、せいぜい弱いものです。与えられたコンテキストに対して正しいことを意味する方を使用してください。(たとえば、誰かがミドルネームを持っていないことがわかっている場合は、String.Empty;を使用します。誰かがミドルネームを持っているかどうかわからない場合は、を使用しますnull)。次に、正しい意味がわかったら、明確に正しく、簡単に保守できる方法でコードを記述します。
ジェイソン2011

回答:


110

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

ldsfldによって引き起こされるスタック上の「汚染」はありません-その懸念は....クレイジーです。aのロードは、ほぼnull間違いなくわずかに安価ですが、値のチェックに注意しないと、null参照の例外が発生する可能性があります。

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


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


5
@ user712923彼が具体的な懸念を持って戻ってきたら、私はそれらを聞きたいです
MarcGravell

4
@Marc:ASAIK ""は、string.Emptyがないオブジェクトを作成します。これこれを確認してください。それはストリングインターンプールと関係があります....–
Jalal Said


1
""6倍長い定型コードの代わりに使用する場合は+1 。このナンセンスを提唱した人は誰ですか?!@JalalそのBradAbramsの投稿は非常に時代遅れであり、コンパイラこれら2つのコードを最適化して同じことを行わない場合は、Microsoftに恥をかかせてください。しかし、彼らの仕事を直すのは私たちの仕事ではありません。実際、次のことを行う必要はありません。2番目のリンクで、Lasse(コメント内)は、いずれかのバリアントと比較したアセンブリ出力を比較しました。これらは同一です。
Konrad Rudolph

1
@Konrad:1つの例は、定数文字列を連結するときに何が起こっているかです。文字列クラスはインターンプールを使用するため、新しい文字列を作成するときに、クラスは文字列がすでにプールにあるかどうかを確認し、ない場合はプールに追加します。そのため、""プール全体を検索してプールがすでに存在するかどうかを確認します。string.Empty;これを使用すると、事前定義された値が使用さ、検索は存在しなくなります。クラスもこのメソッドを公開しました:これをstring.Intern/IsInterned確認してください
Jalal Said

34

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

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

編集、追加された例:

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

  • null構成ファイルで指定されていない構成オプションに使用する場合があります。この場合、string.Emptyconfigオプションが存在するが、必要な構成値が空の文字列である場合に使用されます。


私はそのように考えたことはありません、認めなければなりません。あなたが今言ったことを考えて、例を挙げていただけませんか。あなたの説明は自明ですが、それでも...ありがとう
user712923 2011

2
まあ、どちらかを選択する唯一の理由は、それを使用する場所に基づいています。IEの使用string.Emptyまたは""あなたは、空の文字列を使用したいとするときnull、あなたが指示したいときにデータがありません。あなたは使用することがありますstring.Empty(ほとんどの人は、例えば博士号を持っていない)人の名前のデフォルトの接尾辞として-とnull設定ファイルで指定されていない設定オプションについて。2番目のケースでstring.Emptyは、configオプションが存在するが、必要な構成値が空の文字列である場合に使用されます。
キーレンジョンストーン

@Kieren Johnstone、接尾辞の名前がない場合null、「接尾辞がない」ことを示すために使用しないのはなぜですか?
OfirD

8

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

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

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

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

セグメント1-1バイトに格納され、次のセグメントの長さを説明するメタ情報。

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

例:
文字列 "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に解釈される可能性があります。

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

主題に戻る-それは..説明されているのと同じプリンシパルがnullと空を区別するためにどのシステムでも使用されているのでスタックを汚染します..そうですstring.Emptyはnullよりも多くのメモリを消費しますが、私はそうしませんそれを汚染と呼んでください..それはあと1バイトです。


1

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

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


-2

FWIW、ミキシング""してString.Empty機能しないことがわかりました。

var a = "";
alert("a " + (a == "") + ", " + (a==String.Empty));   //Yields "a true, false"

var b = String.Empty;
alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true"

特に、を使用$.trimして空のDOM入力フィールドの値を取得し、それをと比較するとString.Empty、が取得されfalseます。理由はわかりませんが、そこに行きます。私は今""、一貫性のためにどこでも使用しています。


1
はい。これが、私たち全員がチェック.Length==0または使用する習慣を維持する必要がある理由です.Compare()
zanlok 2012年

14
この質問は、jsではなくc#について尋ねます
Cole Johnson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.