93

Bill Wagner による効果的な C#を読んでいます。Item 14 - Minimize Duplicate Initialization Logicでは、コンストラクターで新しいオプションのパラメーター機能を使用する次の例を示しています。

public MyClass(int initialCount = 0, string name = "")

""彼がの代わりに使用したことに注意してくださいstring.Empty
彼は次のようにコメントしています。

[上記の例で] 2 番目のコンストラクターがnameパラメーターの既定値として "" を指定したことに注意してくださいstring.Empty。これstring.Emptyは、コンパイル時の定数ではないためです。文字列クラスで定義された静的プロパティです。これはコンパイル定数ではないため、パラメータのデフォルト値には使用できません。

string.Emptyすべての状況で静的を使用できない場合、それはその目的を無効にしませんか? 空の文字列を参照するシステムに依存しない手段があることを確認するために、これを使用すると考えました。私の理解は間違っていますか?ありがとう。

更新
フォローアップのコメントです。MSDNによると:

オプションの各パラメータには、その定義の一部としてデフォルト値があります。そのパラメーターに引数が送信されない場合は、デフォルト値が使用されます。デフォルト値は定数でなければなりません。

System.Environment.NewLineその後、どちらも使用することも、新しくインスタンス化されたオブジェクトをデフォルト値として使用することもできません。私はまだVS2010を使用していませんが、これは残念です!

4

7 に答える 7

69

C# 2.0 コンパイラの時点では、とにかくほとんど意味がありませんString.Empty。実際、多くの場合、コンパイラは への参照をインライン化""できますが、同じことはできないため、悲観的String.Emptyです。

C# 1.1 では、空の文字列をすべて含む独立したオブジェクトを多数作成することを避けることができましたが、そのような時代は終わりました。 ""うまく動作します。

于 2010-04-23T19:16:55.640 に答える
56

空の文字列をオプションのパラメーター値として本当に使用したい場合は、空の文字列に対して独自の定数を定義することを妨げるものは何もありません。

const string String_Empty = "";

public static void PrintString(string s = String_Empty)
{
    Console.WriteLine(s);
}

[余談ですが、他の回答では言及されていない、一般的に好まれる理由の 1 つString.Empty""、肉眼では事実上見えないさまざまな Unicode 文字 (幅ゼロのジョイナーなど) があることです。したがって、そのように見えるもの""は必ずしも空の文字列であるとString.Emptyは限りませんが、使用しているものを正確に知ることができます。これがバグの一般的な原因ではないことは認識していますが、可能性はあります。]

于 2012-02-25T11:12:46.813 に答える
26

元の質問から:

空の文字列を参照するシステムに依存しない手段があることを確認するために、これを使用すると思いました。

空の文字列はシステムごとにどのように異なりますか?常に文字のない文字列です!falseが返される実装を見つけたら本当に怖いです:)これはのようなものと同じではありませstring.Empty == ""Environment.NewLine

テロ対策の報奨金の投稿から:

String.Emptyを次のC#リリースのデフォルトパラメーターとして使用できるようにしたい。:D

まあ、それは確かに起こらないだろう。

個人的には非常に異なるデフォルトのメカニズムも気に入っていましたが、オプションのパラメーターの動作は最初から.NETで行われていました。これは常に、呼び出し元のコードがその定数を呼び出しにコピーできるように、メタデータに定数を埋め込むことを意味します。対応する引数が提供されていない場合はサイト。

string.Emptyそれは本当に無意味です-使用すると""あなたが望むことをするでしょう。文字列リテラルを使用するのは大変ですか(私はどこでもリテラルを使用します-私は決して使用しませんstring.Empty-しかしそれは別の議論です。)

それがこの質問について私を驚かせるものです-苦情は実際には実際の問題を引き起こさない何かを中心に展開しています。デフォルトは実際には異なる可能性があるため、実行時にデフォルトを計算する場合はさらに重要です。たとえば、DateTimeパラメータを使用してメソッドを呼び出し、デフォルトで「現在の時刻」に設定できるようにする場合を想像できます。現時点では、私が知っている漠然とエレガントな回避策は次のとおりです。

public void RecordTime(string message, DateTime? dateTime = null)
{
    var realDateTime = dateTime ?? DateTime.UtcNow;
}

...しかし、それは常に適切であるとは限りません。

結論は:

  • これがC#の一部になることは非常に疑わしいです
  • とにかくstring.Empty無意味だから
  • 常に同じ値を持っているとは限らない他の値の場合、それは本当に苦痛になる可能性があります
于 2012-03-03T08:27:59.680 に答える
7

string.Empty を使用することはありません。そのポイントがわかりません。プログラミングに本当に慣れていない人にとっては簡単になるかもしれませんが、それでも役立つとは思えません。

于 2010-04-23T19:13:57.583 に答える
4

string.Empty の背後にあるアイデアは、読みやすさを向上させることだと思います。異なるプラットフォームでの表現方法に違いがある改行のようなものではありません。デフォルトのパラメーターで使用できないのは残念です。ただし、Windows と Linux 上の Mono などの間で移植する場合、問題は発生しません。

于 2010-04-23T19:15:49.040 に答える
3

参考までに、属性コンストラクターに渡される値にも同じ制約が課されているようです - それらは定数でなければなりません。string.empty は次のように定義されているため:

public static readonly string Empty

実際の定数ではなく、使用できません。

于 2012-02-27T15:23:47.537 に答える