C# で、文字列値を空の文字列で初期化したい。
どうすればいいですか?正しい方法とその理由は何ですか?
string willi = string.Empty;
また
string willi = String.Empty;
また
string willi = "";
または何?
C# で、文字列値を空の文字列で初期化したい。
どうすればいいですか?正しい方法とその理由は何ですか?
string willi = string.Empty;
また
string willi = String.Empty;
また
string willi = "";
または何?
あなたとあなたのチームが最も読みやすいと思うものを使用してください。
他の回答では、使用するたびに新しい文字列が作成されることが示唆されています""
。これは正しくありません。文字列のインターンにより、アセンブリごとに 1 回、または AppDomain ごとに 1 回 (または、プロセス全体で 1 回 - その点は不明) 作成されます。この違いはごくわずかです-非常に、非常に重要ではありません。
ただし、どちらが読みやすいかは別の問題です。これは主観的なものであり、人によって異なります。そのため、チームのほとんどの人が好きなものを見つけて、一貫性を保つために全員がそれに従うことをお勧めします。個人的には""
読みやすいと思います。
""
と" "
が互いに間違われやすいという議論は、私にはあまり理解できません。プロポーショナル フォントを使用していない限り (そして、私はプロポーショナル フォントを使用している開発者と仕事をしたことがありません)、違いを見分けるのは非常に簡単です。
パフォーマンスとコード生成の観点からは実際には違いはありません。パフォーマンステストでは、一方が他方よりも高速で、ミリ秒単位で前後しました。
舞台裏のコードを見ると、実際には違いはわかりません。string.Empty
唯一の違いは、オペコードを使用し、オペコードを使用するILldsfld
にありますが、これは静的であり、両方の命令が同じことを行うためです。製造されたアセンブリを見ると、まったく同じです。""
ldstr
string.Empty
private void Test1()
{
string test1 = string.Empty;
string test11 = test1;
}
private void Test2()
{
string test2 = "";
string test22 = test2;
}
.method private hidebysig instance void
Test1() cil managed
{
// Code size 10 (0xa)
.maxstack 1
.locals init ([0] string test1,
[1] string test11)
IL_0000: nop
IL_0001: ldsfld string [mscorlib]System.String::Empty
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: stloc.1
IL_0009: ret
} // end of method Form1::Test1
.method private hidebysig instance void
Test2() cil managed
{
// Code size 10 (0xa)
.maxstack 1
.locals init ([0] string test2,
[1] string test22)
IL_0000: nop
IL_0001: ldstr ""
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: stloc.1
IL_0009: ret
} // end of method Form1::Test2
string test1 = string.Empty;
0000003a mov eax,dword ptr ds:[022A102Ch]
0000003f mov dword ptr [ebp-40h],eax
string test11 = test1;
00000042 mov eax,dword ptr [ebp-40h]
00000045 mov dword ptr [ebp-44h],eax
string test2 = "";
0000003a mov eax,dword ptr ds:[022A202Ch]
00000040 mov dword ptr [ebp-40h],eax
string test22 = test2;
00000043 mov eax,dword ptr [ebp-40h]
00000046 mov dword ptr [ebp-44h],eax
コーディングの基本的な性質は、プログラマーとしての私たちの仕事は、私たちが下すすべての決定がトレードオフであることを認識することです。[…]簡潔に始めましょう。テストで必要に応じて他の寸法を増やします。
したがって、少ないコードほど優れたコードです。 または を優先し""
ます。これらの 2 つは6 倍長く、追加の利点はありません。まったく同じ情報を表現しているため、確かに明瞭さは向上しません。string.Empty
String.Empty
1 つの違いは、構文を使用すると、定数ではないためswitch-case
記述できないことです。case string.Empty:
あなたはCompilation error : A constant value is expected
詳細については、このリンクを参照してください: string-empty-versus-empty-quotes
したいstring
ですString
。選択string.Empty
すること""
は、1つを選択してそれに固執することの問題です。を使用する利点はstring.Empty
、意味が非常に明白であり"\x003"
、""
.
私は声をかけるつもりはありませんでしたが、間違った情報がここに放り出されているのを見ています。
私は、個人的には、を好みstring.Empty
ます。それは個人的な好みであり、私はケースバイケースで一緒に働くチームの意志に屈します.
他の人が言及したように、 と の間にはまったく違いはありませstring.Empty
んString.Empty
。
さらに、これはあまり知られていない事実ですが、"" の使用は完全に受け入れられます。"" のすべてのインスタンスは、他の環境ではオブジェクトを作成します。ただし、.NET はその文字列をインターンするため、将来のインスタンスはインターン プールから同じ不変文字列をプルし、パフォーマンスへの影響は無視できます。出典:ブラッド・エイブラムス。
より複雑なものに正当な理由がない限り、私は個人的に "" を好みます。
String.Empty
とstring.Empty
同等です。String
BCL クラス名です。string
その C# エイリアス (または必要に応じてショートカット) です。Int32
とと同じint
です。その他の例については、ドキュメントを参照してください。
に関する限り""
、私にはよくわかりません。
個人的には、いつも使っていますstring.Empty
。
.NET v4.5 コンソール アプリケーションで次のメソッドを使用して簡単なテストを実行しました。
private static void CompareStringConstants()
{
string str1 = "";
string str2 = string.Empty;
string str3 = String.Empty;
Console.WriteLine(object.ReferenceEquals(str1, str2)); //prints True
Console.WriteLine(object.ReferenceEquals(str2, str3)); //prints True
}
str1
これは、str2
とという 3 つの変数すべてがstr3
、異なる構文を使用して初期化されているにもかかわらず、 memory 内の同じ文字列 (長さゼロ) オブジェクトを指していることを示唆しています。
したがって、内部的には違いはありません。要するに、あなたやあなたのチームがどちらを使いたいかということです。この文字列クラスの動作は、.NET Framework では文字列インターンとして知られています。Eric Lippert は、この概念について説明している非常に優れたブログをここで公開しています。
このトピックはかなり古くて長いので、この動作が別の場所で言及されていたらすみません。(そして、これをカバーする答えを教えてください)
または二重引用符を使用すると、コンパイラの動作に違いがあることがわかりましたstring.Empty
。string.Empty または二重引用符で初期化された文字列変数を使用しない場合、違いは明らかです。
string.Empty
コンパイラ警告で初期化する場合
CS0219 - The variable 'x' is assigned but its value is never used
二重引用符を使用した初期化の場合、期待されるメッセージが表示されますが、出力されることはありません。
この動作は、次のリンクの Connect 記事で説明されています: https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value
基本的に、私が正しく理解すれば、彼らはプログラマーがデバッグ目的で関数の戻り値で変数を設定できるようにしたいと考えています。 Empty は定数ではなくフィールドです。
そこにいるほぼすべての開発者は、「」が何を意味するかを知っています。私は個人的に String.Empty に初めて遭遇し、グーグルで検索して、それらが本当にまったく同じものであるかどうかを判断するのに時間を費やす必要がありました。
上記のいずれか。
教化するべきもっと良いことがたくさんあります。樹皮の色は何色が一番似合うかというと、苔が入ったぼんやりとした茶色がいいと思います。
String.Empty を強くお勧めします。それが何であるかを確実に把握し、内容を誤って削除していないことを確認するための他の理由は別として、主に国際化のためです。文字列が引用符で囲まれている場合、それが新しいコードであり、文字列テーブルに配置する必要があるかどうかを常に考えなければなりません。したがって、コードが変更/レビューされるたびに、「引用符で囲まれたもの」を探す必要があり、空の文字列を除外できますが、ローカライズされないことがわかっている場合を除き、文字列を引用符で囲まないことをお勧めします.
VisualStudio では、文字列の色分けが文字列とは異なることを誰も言及していません。これは読みやすさにとって重要です。また、通常、変数と型には小文字が使用されますが、大したことではありませんが、String.Empty は定数であり、変数や型ではありません。
string
は type の同義語ですSystem.String
, それらは同一です.
値も同じです。string.Empty == String.Empty == ""
コードでは文字定数 "" を使用しません。むしろstring.Empty
、String.Empty
プログラマーの意味を理解しやすくします。
私は長年 Delphi を使用しており、Delphi スタイルは小文字であるという理由だけで、string
小文字がString
好きです。string
string
もし私があなたの上司だったら、あなたはこう書くでしょうstring.Empty
これは完全にコード スタイルの設定であり、.NET が文字列を処理する方法に依存します。ただし、ここに私の意見があります:)
静的メソッド、プロパティ、およびフィールドにアクセスするときは、常に BCL 型の名前を使用します:String.Empty
またはInt32.TryParse(...)
またはDouble.Epsilon
新しいインスタンスを宣言するときは、常に C# キーワードを使用します:int i = 0;
またはstring foo = "bar";
コードをスキャンして再利用可能な名前付き定数に結合できるようにしたいので、宣言されていない文字列リテラルを使用することはめったにありません。とにかくコンパイラは定数をリテラルに置き換えます。これは、魔法の文字列/数字を回避し、名前でそれらにもう少し意味を与えるためのより多くの方法です。さらに、値を変更する方が簡単です。
私は違いはありません。ただし、最後のものは入力するのが最も速いです:)
それは問題ではありません - それらはまったく同じものです。ただし、重要なことは、一貫性を保つ必要があるということです
ps私はいつもこの種の「何が正しいのか」に苦労しています。
私は 3 番目を使用しますが、他の 2 つの中では最初のほうが奇妙に思えません。string は String のエイリアスですが、割り当て全体でそれらを見ると気分が悪くなります。
最初の 2 つのいずれかは、私には受け入れられます。引用符の間にスペースを入れることでバグを導入するのは比較的簡単なので、最後のものは避けます。この特定のバグは、観察によって見つけるのは困難です。タイプミスがなければ、すべて意味的に同等です。
[編集]
string
また、一貫性のために常にorのいずれかを使用したい場合がありますが、String
それは私だけです。
私はいくつかのコードを見ているだけで、この質問が頭に浮かびました。これは確かに読みやすさの問題です。
次の C# コードを検討してください...
(customer == null) ? "" : customer.Name
対
(customer == null) ? string.empty : customer.Name
個人的には、後者の方が曖昧さが少なく、読みやすいと思います。
他の人が指摘したように、実際の違いはごくわずかです。
コンパイラは、長期的にはそれらをすべて同じにする必要があります。コードが読みやすくなるように標準を選び、それを守りましょう。
違いはごくわずかですが、違いはまだ存在します。
1) ""はオブジェクトを作成しますが、String.Emptyは作成しません。ただし、このオブジェクトは一度作成され、コードに別の ""がある場合は、後で文字列プールから参照されます。
2)文字列と文字列は同じですが、ドット表記は演算子ではなくクラスを示し、大文字で始まるクラスはに準拠しているため、String.Empty(およびString.Format、String.Copyなど)を使用することをお勧めしますC#コーディング標準。
http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx : _
David が暗示しているように、 と の間
String.Empty
に""
はかなり小さな違いがありますが、違いはあります。""
実際にオブジェクトを作成すると、文字列インターンプールから引き出される可能性がありますが、それでも...String.Empty
オブジェクトは作成されません...したがって、最終的にメモリ効率を本当に探している場合は、String.Empty
. ただし、違いは非常に些細なことであり、コード内で決して見られないことを覚えておく必要があります... or or ...
に関しては、私のケアレベルは低いです;-)System.String.Empty
string.Empty
String.Empty
2つ目は「適当」でいいと思いますが、正直、関係ないと思います。コンパイラは、それらのいずれかをまったく同じバイトコードにコンパイルするのに十分なほどスマートでなければなりません。私は「」を自分で使用します。