65

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をチェックする必要がないように、プログラマーの生活を楽にするためですか?

4

5 に答える 5

60

MSDNから:

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

+ 二項演算子の詳細:

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

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

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

于 2009-03-12T04:04:49.147 に答える
6

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

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

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

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

于 2009-04-28T18:17:39.110 に答える
3

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

于 2009-03-12T04:31:42.047 に答える
1

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

(いいですね! null と連結すると例外が発生するといつも思っていました!)

于 2009-03-12T04:08:47.653 に答える
0

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

于 2009-03-12T04:08:13.007 に答える