web-dev-qa-db-ja.com

文字列にnullを追加するのはなぜ正当なのですか?

String Basics に関するMSDNの記事はこれを示しています:

string str = "hello";
string nullStr = null;
string emptyStr = "";

string tempStr = str + nullStr; // tempStr = "hello"
bool b = (emptyStr == nullStr);// b = false;
string newStr = emptyStr + nullStr; // creates a new empty string
int len = nullStr.Length; // throws NullReferenceException

Nullと連結しないとnull参照例外がスローされるのはなぜですか?プログラマーの生活を楽にするために、つまり、連結する前にnullをチェックする必要がないようにするためでしょうか。

61
David Hodgson

から [〜#〜] msdn [〜#〜]

文字列連結演算では、C#コンパイラはnull文字列を空の文字列と同様に扱いますが、元のnull文字列の値は変換しません。

+二項演算子 の詳細:

二項+演算子は、一方または両方のオペランドが文字列型である場合、文字列連結を実行します。

文字列連結のオペランドがnullの場合、空の文字列が置換されます。それ以外の場合、文字列以外の引数は、型オブジェクトから継承された仮想ToStringメソッドを呼び出すことにより、文字列表現に変換されます。

ToStringがnullを返す場合、空の文字列が置換されます。

57
CMS

概念的に文字列は単なる値であることに同意します。ただし、次のコードを検討してください。

int? i = null;
i += 1; // The result of this is that i == null

文字列演算子がnullを ""に変換する方法で他の値型演算子がdefault()を使用した場合、説明は意味があります。

文字列演算子は、便宜上のショートカット(特殊なケース)であると言うのが最も簡単です。

6
Nathan Alden

概念的には、文字列は通常、アイデンティティを持つオブジェクトへの参照とは対照的に、値と見なされます。値のセマンティクスでstructsにならない主な理由の1つは、割り当て時のコピーに伴うオーバーヘッドが原因です。文字列were値の場合、nullにすることはできなかったため、nullは「+」演算子によって空の文字列のように扱われます(つまり、default(string) == ""default(int) == 0と同じです)。

3
Mark Cidade

言語(または標準ライブラリ)の設計者は、これがプログラマーに好意を示すのに十分一般的なケースであると判断したと思います。

(きちんとしている!私はいつもnullで連結することは例外を通過するだろうと思っていた!)

1
Dana

Null参照例外がスローされない理由は、nullオブジェクトのプロパティやメソッドに実際にアクセスしようとしていないためです。 CMSの引用として、文字列を連結すると、nullは空の文字列に置き換えられます。

0
tarn