合体と空の文字列の連結
-
03-07-2019 - |
質問
私の同僚はC#の初心者であり、合体演算子については知りませんでした。だから、私は彼が次のようなコード行を書いているのを見ました:
string foo = "" + str;
strがnullの場合、この式は空の文字列を返すという考え方です。もちろん、これは次のように書き換えることができます。
string foo = str ?? "";
そして、もっと読みやすくなると思います。しかし、それは本当に大したことですか?読みやすさの利点は、戻ってそれらの行を2番目の行のようにすることを示唆するのに十分ですか?または、これは私が手放すことを学ぶべきものの1つですか(将来、これを行うための最良の方法について同僚が教育を受けている場合)?
編集:注:効率性のコメントはありがたいですが、パフォーマンスが重要になるような状況では実際には使用されていません。その情報は興味深いものですが、必ずしも私が重要だと思うものではありません。
解決
IMO、そのようなロジックを明確に定義する方がはるかに優れています。つまり、null文字列を避けて条件文または??を使用するために文字列連結を使用しないでください。演算子。
他のコメントについて:
には、パフォーマンス上の利点もあります null合体演算子を使用して、 連結する必要がないため (したがって、余分な文字列はありません インスタンスが作成されています 不要に)
真実ではない。 C#コンパイラは""をコンパイルします+ string2をstring1と100%同じコードに?? ""。さらに、C#コンパイラは+演算子をstring.Concatメソッドの呼び出しに変換します。このメソッドは、string.IsNullOrEmpty関数で引数を確認し、この場合は新しい文字列を割り当てません。
また、私はの使用をお勧めします String.Empty over""そのまま 定数であり、必要としません 新しい文字列の作成
.NETフレームワークは文字列インターンをサポートしているため、"" string.Emptyは同じメモリ領域を指します
他のヒント
個人的には、他の人よりも読みやすいとは思いません。私はこれを好む:
string foo = str ?? "";
単に私が本当に好きだから??演算子。
もしあなたがまったくの初心者なら、これは少し理解しやすいと思います:
string foo = str == null ? "" : str;
または
string foo = "";
if (str != null) foo = str;
ただし、「あなたは本当にどれだけシンプルにしたいのですか?」
技術的な観点から2行目を好む一方で、実際には1行目が読みやすい...
2行目は読みやすく、右側の式の意図が明確になります。
str
がnullである場合に対してより積極的で、表現力が高いため、2番目の例を好むでしょう。 また、 ""
は定数であり、新しい Stringを作成する必要がないため、
(そしてこれは非常に重要ですが、注意することが重要です)。""
よりも String.Empty
を使用することをお勧めします。
合体演算子または foo = str == nullを使用しますか? "" :str;
には2つの理由があります:
-
最初の例は、他の波括弧言語(特にJavaとJavaScript)で同じ動作をしません。空の文字列にnull参照を追加すると、
null コード>。その結果、最初の例では、作成中の言語で正しい動作が得られるように、より多くの精神的な努力が必要です。他の手がかりが与えられたとしても、C#(小文字の
string
など)であり、開発者が「このコードの意図は何か」を遅くして考えなければならないものです。生産性が失われます。また、言語から言語に移行するときにバグが発生する可能性があります。 -
2番目の例では、コードの意図をより明確に表現しています。これは、元の質問で説明したとおりです:
strがnullの場合、fooを空の文字列に設定します
最初の例とは対照的に、次のように読むことができます:
fooにstrを追加した空の文字列に設定します(strがnullの場合、fooに空の文字列を設定する副作用があります)
プログラマーとしては、他の操作の副作用に頼って目的の結果を得るのではなく、おそらくコードの意図を表現しようとしているはずです。
string.emptyと""に関する記事です