756

C# で、文字列値を空の文字列で初期化したい。

どうすればいいですか?正しい方法とその理由は何ですか?

string willi = string.Empty;

また

string willi = String.Empty;

また

string willi = "";

または何?

4

30 に答える 30

856

あなたとあなたのチームが最も読みやすいと思うものを使用してください。

他の回答では、使用するたびに新しい文字列が作成されることが示唆されています""。これは正しくありません。文字列のインターンにより、アセンブリごとに 1 回、または AppDomain ごとに 1 回 (または、プロセス全体で 1 回 - その点は不明) 作成されます。この違いはごくわずかです-非常に、非常に重要ではありません。

ただし、どちらが読みやすいかは別の問題です。これは主観的なものであり、人によって異なります。そのため、チームのほとんどの人が好きなものを見つけて、一貫性を保つために全員がそれに従うことをお勧めします。個人的には""読みやすいと思います。

""" "が互いに間違われやすいという議論は、私にはあまり理解できません。プロポーショナル フォントを使用していない限り (そして、私はプロポーショナル フォントを使用している開発者と仕事をしたことがありません)、違いを見分けるのは非常に簡単です。

于 2008-11-04T20:07:39.567 に答える
386

パフォーマンスとコード生成の観点からは実際には違いはありません。パフォーマンステストでは、一方が他方よりも高速で、ミリ秒単位で前後しました。

舞台裏のコードを見ると、実際には違いはわかりません。string.Empty唯一の違いは、オペコードを使用し、オペコードを使用するILldsfld にありますが、これは静的であり、両方の命令が同じことを行うためです。製造されたアセンブリを見ると、まったく同じです。""ldstrstring.Empty

C#コード

private void Test1()
{
    string test1 = string.Empty;    
    string test11 = test1;
}

private void Test2()
{
    string test2 = "";    
    string test22 = test2;
}

ILコード

.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 
于 2009-10-19T13:31:16.547 に答える
88

最良のコードは、まったくコードがないことです:

コーディングの基本的な性質は、プログラマーとしての私たちの仕事は、私たちが下すすべての決定がトレードオフであることを認識することです。[…]簡潔に始めましょう。テストで必要に応じて他の寸法を増やします。

したがって、少ないコードほど優れたコードです。 または を優先し""ます。これらの 2 つは6 倍長く、追加の利点はありません。まったく同じ情報を表現しているため、確かに明瞭さは向上しません。string.EmptyString.Empty

于 2008-11-04T20:04:34.440 に答える
56

1 つの違いは、構文を使用すると、定数ではないためswitch-case記述できないことです。case string.Empty:あなたはCompilation error : A constant value is expected

詳細については、このリンクを参照してください: string-empty-versus-empty-quotes

于 2011-08-26T08:58:10.727 に答える
46

したいstringですString。選択string.Emptyすること""は、1つを選択してそれに固執することの問題です。を使用する利点はstring.Empty、意味が非常に明白であり"\x003""".

于 2008-11-04T19:52:38.380 に答える
24

私は声をかけるつもりはありませんでしたが、間違った情報がここに放り出されているのを見ています。

私は、個人的には、を好みstring.Emptyます。それは個人的な好みであり、私はケースバイケースで一緒に働くチームの意志に屈します.

他の人が言及したように、 と の間にはまったく違いはありませstring.EmptyString.Empty

さらに、これはあまり知られていない事実ですが、"" の使用は完全に受け入れられます。"" のすべてのインスタンスは、他の環境ではオブジェクトを作成します。ただし、.NET はその文字列をインターンするため、将来のインスタンスはインターン プールから同じ不変文字列をプルし、パフォーマンスへの影響は無視できます。出典:ブラッド・エイブラムス

于 2008-11-04T20:07:08.307 に答える
16

より複雑なものに正当な理由がない限り、私は個人的に "" を好みます。

于 2008-11-04T19:50:51.787 に答える
14

String.Emptystring.Empty同等です。StringBCL クラス名です。stringその C# エイリアス (または必要に応じてショートカット) です。Int32とと同じintです。その他の例については、ドキュメントを参照してください。

に関する限り""、私にはよくわかりません。

個人的には、いつも使っていますstring.Empty

于 2008-11-04T19:53:07.430 に答える
13

.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 は、この概念について説明している非常に優れたブログをここで公開しています。

于 2016-10-12T12:37:37.747 に答える
11

このトピックはかなり古くて長いので、この動作が別の場所で言及されていたらすみません。(そして、これをカバーする答えを教えてください)

または二重引用符を使用すると、コンパイラの動作に違いがあることがわかりました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 は定数ではなくフィールドです。

于 2016-04-29T21:09:27.863 に答える
11

そこにいるほぼすべての開発者は、「」が何を意味するかを知っています。私は個人的に String.Empty に初めて遭遇し、グーグルで検索して、それらが本当にまったく同じものであるかどうかを判断するのに時間を費やす必要がありました。

于 2009-05-31T19:34:43.447 に答える
9

上記のいずれか。

教化するべきもっと良いことがたくさんあります。樹皮の色は何色が一番似合うかというと、苔が入ったぼんやりとした茶色がいいと思います。

于 2008-11-04T19:50:53.453 に答える
7

String.Empty を強くお勧めします。それが何であるかを確実に把握し、内容を誤って削除していないことを確認するための他の理由は別として、主に国際化のためです。文字列が引用符で囲まれている場合、それが新しいコードであり、文字列テーブルに配置する必要があるかどうかを常に考えなければなりません。したがって、コードが変更/レビューされるたびに、「引用符で囲まれたもの」を探す必要があり、空の文字列を除外できますが、ローカライズされないことがわかっている場合を除き、文字列を引用符で囲まないことをお勧めします.

于 2009-01-22T17:03:09.630 に答える
7

VisualStudio では、文字列の色分けが文字列とは異なることを誰も言及していません。これは読みやすさにとって重要です。また、通常、変数と型には小文字が使用されますが、大したことではありませんが、String.Empty は定数であり、変数や型ではありません。

于 2012-05-24T16:16:36.840 に答える
6

stringは type の同義語ですSystem.String, それらは同一です.

値も同じです。string.Empty == String.Empty == ""

コードでは文字定数 "" を使用しません。むしろstring.EmptyString.Emptyプログラマーの意味を理解しやすくします。

私は長年 Delphi を使用しており、Delphi スタイルは小文字であるという理由だけで、string小文字がString好きです。stringstring

もし私があなたの上司だったら、あなたはこう書くでしょうstring.Empty

于 2008-11-04T20:00:50.487 に答える
5

これは完全にコード スタイルの設定であり、.NET が文字列を処理する方法に依存します。ただし、ここに私の意見があります:)

静的メソッド、プロパティ、およびフィールドにアクセスするときは、常に BCL 型の名前を使用します:String.EmptyまたはInt32.TryParse(...)またはDouble.Epsilon

新しいインスタンスを宣言するときは、常に C# キーワードを使用します:int i = 0;またはstring foo = "bar";

コードをスキャンして再利用可能な名前付き定数に結合できるようにしたいので、宣言されていない文字列リテラルを使用することはめったにありません。とにかくコンパイラは定数をリテラルに置き換えます。これは、魔法の文字列/数字を回避し、名前でそれらにもう少し意味を与えるためのより多くの方法です。さらに、値を変更する方が簡単です。

于 2010-08-31T21:52:36.813 に答える
5

私は違いはありません。ただし、最後のものは入力するのが最も速いです:)

于 2008-11-04T19:52:56.523 に答える
4

それは問題ではありません - それらはまったく同じものです。ただし、重要なことは、一貫性を保つ必要があるということです

ps私はいつもこの種の「何が正しいのか」に苦労しています。

于 2008-11-04T20:01:25.087 に答える
3

私は 3 番目を使用しますが、他の 2 つの中では最初のほうが奇妙に思えません。string は String のエイリアスですが、割り当て全体でそれらを見ると気分が悪くなります。

于 2008-11-04T19:51:36.293 に答える
3

最初の 2 つのいずれかは、私には受け入れられます。引用符の間にスペースを入れることでバグを導入するのは比較的簡単なので、最後のものは避けます。この特定のバグは、観察によって見つけるのは困難です。タイプミスがなければ、すべて意味的に同等です。

[編集]

stringまた、一貫性のために常にorのいずれかを使用したい場合がありますが、Stringそれは私だけです。

于 2008-11-04T19:55:19.873 に答える
2

私はいくつかのコードを見ているだけで、この質問が頭に浮かびました。これは確かに読みやすさの問題です。

次の C# コードを検討してください...

(customer == null) ? "" : customer.Name

(customer == null) ? string.empty : customer.Name

個人的には、後者の方が曖昧さが少なく、読みやすいと思います。

他の人が指摘したように、実際の違いはごくわずかです。

于 2017-01-10T16:11:03.353 に答える
2

コンパイラは、長期的にはそれらをすべて同じにする必要があります。コードが読みやすくなるように標準を選び、それを守りましょう。

于 2008-11-04T19:52:02.143 に答える
1

違いはごくわずかですが、違いはまだ存在します。

1) ""はオブジェクトを作成しますが、String.Emptyは作成しません。ただし、このオブジェクトは一度作成され、コードに別の ""がある場合は、後で文字列プールから参照されます。

2)文字列と文字列は同じですが、ドット表記は演算子ではなくクラスを示し、大文字で始まるクラスはに準拠しているため、String.Empty(およびString.Format、String.Copyなど)を使用することをお勧めしますC#コーディング標準。

于 2008-11-05T07:12:38.837 に答える
1

http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx : _

David が暗示しているように、 と の間String.Empty""はかなり小さな違いがありますが、違いはあります。""実際にオブジェクトを作成すると、文字列インターンプールから引き出される可能性がありますが、それでも...String.Emptyオブジェクトは作成されません...したがって、最終的にメモリ効率を本当に探している場合は、String.Empty. ただし、違いは非常に些細なことであり、コード内で決して見られないことを覚えておく必要があります... or or ...
に関しては、私のケアレベルは低いです;-)System.String.Emptystring.EmptyString.Empty

于 2011-11-16T02:28:27.170 に答える
1

2つ目は「適当」でいいと思いますが、正直、関係ないと思います。コンパイラは、それらのいずれかをまったく同じバイトコードにコンパイルするのに十分なほどスマートでなければなりません。私は「」を自分で使用します。

于 2008-11-04T19:52:04.340 に答える