最近、職場の同僚が私に使用しないように言った string.Empty
、文字列変数を設定ときnull
、スタックを汚染とき。
彼はしないでくださいと言います
string myString=string.Empty;
しかし、します string mystring=null;
それは本当に重要ですか?文字列はオブジェクトであることを知っているので、それはある意味意味があります。
ばかげた質問だと思いますが、あなたの見解は何ですか?
最近、職場の同僚が私に使用しないように言った string.Empty
、文字列変数を設定ときnull
、スタックを汚染とき。
彼はしないでくださいと言います
string myString=string.Empty;
しかし、します string mystring=null;
それは本当に重要ですか?文字列はオブジェクトであることを知っているので、それはある意味意味があります。
ばかげた質問だと思いますが、あなたの見解は何ですか?
string.Empty
、""
、およびnull
すべての定数値ですが、彼らはあなたが変数に1を代入したい理由は、私が見ることができないすべての「シンプル」は十分です。out
変数をキャプチャする必要がある場合は、単に使用しないのはなぜstring myString;
ですか?
String.Empty
;を使用します。誰かがミドルネームを持っているかどうかわからない場合は、を使用しますnull
)。次に、正しい意味がわかったら、明確に正しく、簡単に保守できる方法でコードを記述します。
回答:
null
とEmpty
は非常に異なり、それらを任意に切り替えることはお勧めしません。ただし、はEmpty
単一の固定参照であるため、どちらにも追加の「コスト」はありません(何度でも使用できます)。
ldsfldによって引き起こされるスタック上の「汚染」はありません-その懸念は....クレイジーです。aのロードは、ほぼnull
間違いなくわずかに安価ですが、値のチェックに注意しないと、null参照の例外が発生する可能性があります。
個人的には、どちらも使用していません...空の文字列が必要な場合は、""
単純で明白です。インターンとは、これにも使用ごとのオーバーヘッドがないことを意味します。
ILレベルでは、ここでの ""とEmptyの違いは、ldstrとldsfldだけですが、どちらも同じ単一のインターン文字列参照を提供します。さらに、最近の.NETバージョンでは、JITはこれらを直接インターセプトし、静的フィールドルックアップを実際に実行せずに空の文字列参照を生成します。基本的に、読みやすさを除いて、どちらの方法でも気にする理由はまったくありません。「」を使用します。
""
6倍長い定型コードの代わりに使用する場合は+1 。このナンセンスを提唱した人は誰ですか?!@JalalそのBradAbramsの投稿は非常に時代遅れであり、コンパイラがこれら2つのコードを最適化して同じことを行わない場合は、Microsoftに恥をかかせてください。しかし、彼らの仕事を直すのは私たちの仕事ではありません。実際、次のことを行う必要はありません。2番目のリンクで、Lasse(コメント内)は、いずれかのバリアントと比較したアセンブリ出力を比較しました。これらは同一です。
""
プール全体を検索してプールがすでに存在するかどうかを確認します。string.Empty;
これを使用すると、事前定義された値が使用され、検索は存在しなくなります。クラスもこのメソッドを公開しました:これをstring.Intern/IsInterned
確認してください
「スタックを汚染する」ことはありません。技術的な理由はありませんが、変数をオブジェクトへの参照に設定すること(空の文字列であっても)とnull
。の間に大きな違いがあります。それらは同じものではなく、異なる方法で使用する必要があります。
null
データがないことを示すためにstring.Empty
(または""
)データが存在することを示すために使用する必要があります。実際には空のテキストです。何が最も適切かわからない特定のケースはありますか?
編集、追加された例:
string.Empty
人の名前のデフォルトの接尾辞として使用できます(たとえば、ほとんどの人は博士号を持っていません)
null
構成ファイルで指定されていない構成オプションに使用する場合があります。この場合、string.Empty
configオプションが存在するが、必要な構成値が空の文字列である場合に使用されます。
string.Empty
または""
あなたは、空の文字列を使用したいとするときnull
、あなたが指示したいときにデータがありません。あなたは使用することがありますstring.Empty
(ほとんどの人は、例えば博士号を持っていない)人の名前のデフォルトの接尾辞として-とnull
設定ファイルで指定されていない設定オプションについて。2番目のケースでstring.Empty
は、configオプションが存在するが、必要な構成値が空の文字列である場合に使用されます。
null
、「接尾辞がない」ことを示すために使用しないのはなぜですか?
他の人がすでに答えたように、彼らは異なっています。
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バイトです。
死ぬまで答えられましたが、nullは値がなく、初期化されていないことを意味します。string.Emptyは、MSDNに記載されている「」(空白の文字列)を意味します。
空の文字列またはnull文字列をチェックする最も安全な方法は、string.IsNullOrEmptyを使用することです。
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
ます。理由はわかりませんが、そこに行きます。私は今""
、一貫性のためにどこでも使用しています。
.Length==0
または使用する習慣を維持する必要がある理由です.Compare()