11

とりわけ、 int privateCountとして宣言されたパラメーターを取る関数があります。このパラメーターで ToString() を呼び出したい場合、ReSharper はそれをグレー表示し、冗長呼び出しとしてマークします。好奇心旺盛なので、ToString() を削除しても、コードは引き続きビルドされます。

strが文字列の場合、C# コンパイラはこれをどのように許可できますか?

str += privateCount +...

4

4 に答える 4

20

文字列の + 演算子はオーバーロードされ、式の左側と右側を渡して String.Concat を呼び出します。したがって:

string x = "123" + 45;

次のようにコンパイルされます。

String.Concat("123", 45);

String.Concat は 2 つのオブジェクトを受け取るため、右側 (45) がボックス化され、ToString() が呼び出されます。

この「オーバーロード」は、言語での演算子のオーバーロード (別名、op_Addition という名前のメソッドではない) によるものではなく、コンパイラによって処理されることに注意してください。

于 2008-09-16T16:54:38.617 に答える
8

これは悪い習慣であるだけでなく、パフォーマンスも低下します。int.ToString() はボックス化を必要としないのに対し、String.Concat はオブジェクトを想定しているため、整数をボックス化する必要があります。

于 2008-09-16T18:23:50.290 に答える
2

C# は、オブジェクトを文字列に自動的に変換します。次のコード行を検討してください。

aString = aString + 23;

これは有効な C# です。これは、2 つのオブジェクトを引数として取る String.Concat() への呼び出しにコンパイルされます。これらのオブジェクトは、自動的に文字列オブジェクトに変換されます。

次のように書くと、同じことが起こります。

aString += 23;

繰り返しますが、これは String.Concat(); への同じ呼び出しにコンパイルされます。書き方が違うだけです。

于 2008-09-16T16:59:38.790 に答える
1

変数が文字列または整数の場合はよく考える必要があるため、これは有効な悪い習慣です。変数が myInt と呼ばれるとどうなるでしょうか?

myInt = myInt + 23;

この形式の方が読みやすく、理解しやすいですか?

myInt = mInt + "23";

あるいは:

myInt = string.Format("{0}{1}", myInt, 23);

コードから、これが整数ではなく文字列であることがわかります。

于 2008-09-16T17:06:57.463 に答える