8

私の同僚は C# が初めてで、合体演算子について知りませんでした。それで、私は彼が次のようなコード行を書いているのを見ました:

string foo = "" + str;

str が null の場合、この式は空の文字列を返すという考えです。もちろん、これは次のように書き換えることができます。

string foo = str ?? "";

そして、その方が読みやすいと思います。しかし、それは本当に大したことですか?読みやすさの利点は、戻ってそれらの行を 2 番目のように見せることを提案するのに十分ですか? それとも、これは手放すことを学ばなければならないことの 1 つですか (私の同僚が将来これを行うための最善の方法について教育を受けている場合)?

編集:メモ、効率のコメントに感謝しますが、これはそのパフォーマンスが重要な状況では実際には使用されていません。その情報は興味深いものですが、必ずしも私が重要だと感じるものではありません.

4

6 に答える 6

10

IMO、そのようなロジックを明確に定義する方がはるかに優れています。つまり、文字列連結を使用して null 文字列を回避し、条件ステートメントまたは ?? を使用しないでください。オペレーター。

その他のコメントについて:

連結を行う必要がないため、null 合体演算子を使用するとパフォーマンス上の利点もあります (したがって、余分な文字列インスタンスが不必要に作成されることはありません)。

違います。C# コンパイラは "" + string2 を string1 と 100% 同じコードにコンパイルします ?? ""。さらに、C# コンパイラは + 演算子を変換して string.Concat メソッドを呼び出します。このメソッドは、string.IsNullOrEmpty 関数で引数をチェックし、この場合は新しい文字列を割り当てません。

また、"" よりも String.Empty を使用することをお勧めします。これは定数であり、新しい String を作成する必要がないためです。

.NET フレームワークは文字列のインターンをサポートしているため、"" と string.Empty は同じメモリ領域を指します

于 2009-01-06T13:24:13.437 に答える
3

個人的には、一方が他方よりも読みやすいとは思いません。私はこれを好みます:

string foo = str ?? "";

単に私が本当に好きだから?? オペレーター。

あなたがまったくの初心者なら、これは少し理解しやすいと思います:

string foo = str == null ? "" : str;

また

string foo = "";
if (str != null) foo = str;

ただし、「本当にどれだけシンプルにしたいですか?」と自問する必要があります。

于 2009-01-06T13:27:32.807 に答える
2

技術的な観点からは 2 行目を好みますが、実際には 1 行目のほうが読みやすいです...

于 2009-01-06T13:31:43.360 に答える
1

合体演算子を使用するかfoo = str == null ? "" : str;、次の 2 つの理由から使用します。

  1. 最初の例は、空の文字列に null 参照を追加すると、テキストを含む文字列になる他の中括弧言語 (特に Java と JavaScript) では同じ動作をしませんnull。その結果、最初の例では、作成中の言語で正しい動作が得られるようにするために、より多くの精神的努力が必要になります。他の手がかりが C# (小文字の type などstring) であっても、開発者が速度を落として「このコードの意図は何か」を考える必要があると、生産性が失われます。また、言語から言語への移行時にバグが発生する可能性もあります。

  2. 2 番目の例は、元の質問で説明されているように、コードの意図をより明確に表しています。

    when str is null set foo to an empty string

    最初の例とは対照的に、次のように読むことができます。

    set foo to an empty string with str appended (which may have the side effect of setting foo to an empty string when str is null)

プログラマーとして、私たちが望む結果を得るために他の操作の副作用に頼るのではなく、おそらくコードの意図を表現しようとするべきです。

于 2009-01-06T20:34:38.013 に答える
1

str2番目の例は、 nullになること に対してより積極的であり、より表現力があるため、最初の例よりも好ましいと思います。また、 overは定数であり、新しいものを作成する必要がないため、String.Emptyoverの使用をお勧めします(はい、これは極端な問題ですが、注意することが重要です)。""String

于 2009-01-06T13:25:11.157 に答える
1

2 行目の方が読みやすく、右側の式の意図が明確になります。

于 2009-01-06T13:25:26.663 に答える