5

System.String には、オーバーロードされた Operator が 2 つしかありません

public static bool operator ==(string a, string b)
{
  return string.Equals(a, b);
}

public static bool operator !=(string a, string b)
{
  return !string.Equals(a, b);
}

ただし、文字列連結に += を使用する場合、例:

    private static void Main()
    {
        String str = "Hello ";
        str += "World";

        Console.WriteLine(str);
    }

それはうまく動作し、

では、System.String が演算子 += をオーバーロードしていない場合、文字列を連結するのはなぜでしょうか?

4

4 に答える 4

8

まず、演算子+=はオーバーロードできません。式がある場合A += B、次のようにコンパイルされます:*

A = A + B

オーケー、それがstringオーバーロードしない理由ですoperator +=(オーバーロードできないからです)。では、なぜ過負荷にならないoperator +のでしょうか? これは、CLR と C# のもう 1 つの違いにすぎません。C# コンパイラは、 や のような型stringint特殊であることを認識しており、それらの演算子用に特別なコードを生成します ( string.Concat()for string、またはaddfor の命令を呼び出しintます)。

これらの演算子が特別な方法で扱われるのはなぜですか? 特別扱いしてほしいからです。これは次の場合に最も明確だと思いますint

  1. int追加をメソッド呼び出しとしてコンパイルしないと、多くのオーバーヘッドが追加されます。そのため、加算用の特別な命令intが使用されます。
  2. 整数加算は、オーバーフローに関して常に同じように動作するとは限りません。checkedオーバーフローの例外をスローするコンパイラ スイッチがあり、 andunchecked演算子も使用できます。しかなかった場合、コンパイラはそれをどのように処理する必要がありoperator +ますか? (実際に行うことはadd、未チェックのオーバーフローとチェック済みのオーバーフローに命令を使用することadd.ovfです。)

stringまた、パフォーマンス上の理由から、足し算も特別な方法で扱いたいと考えています。たとえば、strings abandcと write がa + b + cあり、それを の 2 つの呼び出しとしてコンパイルした場合、 の結果にoperator +一時を割り当てる必要がありますが、これは非効率的です。代わりに、コンパイラはそのコードを として生成し、必要な長さの文字列を 1 つだけ直接割り当てることができます。stringa + bstring.Concat(a, b, c)


* これは厳密には正しくありません。詳細については、Eric Lippert の記事「Compound Assignment, Part One and Compound assignment in the C# specification」を参照してください。また、欠落しているセミコロンにも注意してください。A += B実際には式です。たとえば、次のように記述できますX += Y += Z;

于 2013-01-23T10:53:08.653 に答える
5

+=operatorのオーバーロードはありません。これは の省略形ですvar = var + newValue。弦の場合も同様です。

+= 演算子 (C# リファレンス)

+= 演算子は直接オーバーロードできませんが、ユーザー定義型は + 演算子をオーバーロードできます

次の例を検討してください。

string str = "new string";
str += "new value";

これは次のようになります。

str = str + "new value";

string.Concatコンパイル時に内部的に呼び出します。

于 2013-01-23T06:26:46.227 に答える
3

+=明示的に実装されていませんが、コンパイラが魔法のように機能するため機能します

str += "World";

str =  str + "World";

str = str.Concat("World");
于 2013-01-23T06:26:55.780 に答える
0

上記の人が言ったように、.NETによればstring += otherString

string = string + otherString

この .NET リンクは連結演算子について言及しており、この .NET リンクは 2 つの操作の関係について説明しています。

于 2013-01-23T06:34:21.227 に答える