3

リストにアイテムを追加またはリストから削除する必要があるC#スクリプトがあります。+=および-=演算子を使用する方がよいと思いました。

C#では、演算子は次のように実行されます。

public Foo operator +(Foo A, Foo B){
    //Some adding code;
    return C;
}

ただし、次のように試みた場合にのみ構文エラーが発生します。

public SpriteValues operator +=(SpriteValues A){
    //Add A to this
    return this;
}

私はPythonでそれが使用して行われることを知っています:

def __iadd__(self, A):
    #Add A to this
    return self

では、C#でこれを行うにはどうすればよいですか?

4

5 に答える 5

6

ここから、+ =を直接オーバーロードすることはできませんが、コメントに注意してください。

Assignment operators cannot be overloaded, but +=, for example, is evaluated using +, which can be overloaded

したがって、+演算子をオーバーロードするだけの場合は問題ありません

于 2013-03-23T18:05:12.980 に答える
2

の省略形であるため、+=演算子をオーバーロードすることはできません。a += ba = a + b

演算子をオーバーロードすると、オブジェクト+で使用できるようになり+=ます。

于 2013-03-23T18:05:38.863 に答える
1

オーバーロードすることはできませんが、オーバーライドする限り、演算子を割り当てで使用し+=ます。++

于 2013-03-23T18:06:16.740 に答える
-1

これらの操作には+/-を実装しないことをお勧めします。多くの場合、混乱を招く使用法になります。リストが変更可能であると仮定すると(そのため、追加および削除操作が必要になります)、+/-の定義は注意が必要です。考えるべきいくつかの問題があります。

1つの要件は、+副作用を引き起こしてはならないということです。var z = x + y変異したりxy。したがって、+/-内に新しいリストを作成する必要があります。ほとんどの開発者はこれが起こることを期待せず、アイテムが追加されるたびにアイテムをコピーするのは非常に費用がかかるでしょう。

追加/削除するたびにコピーを実行できるとしましょう。このフラグメントを実行した後のプログラムの状態はどうなると思いますか。

var list1 = new MyList();
var list2 = list1;
list2 += item;

ほとんどの人はそれを期待しlist1list2現在そこにあるのと同じリストオブジェクトを参照しますitem。ただし、+新しいリストが作成されるため、それは起こりません。list1空でlist2あり、を含む別のリストですitem。これは非常に奇妙です。

リストが変更可能であるという要件、+/-が副作用を引き起こさないという要件、または+=が新しいリストを作成しないという期待を削除する必要があります。もちろん、フレームワークでは、デリゲートにはこれらの演算子があり、不変です。デリゲートの+/-の動作は、言語のより紛らわしい部分の1つであるため、エミュレートすることはお勧めしません。

セマンティクスがよく知られていて簡単に予測できるAdd/Removeメソッドを実装する通常のルートに行きます。

于 2013-03-23T18:49:29.300 に答える
-2

リストは非常に一般的なジェネリッククラスであるため、リストに追加したり、リストから削除したりできるよく知られたメソッド(つまり、追加と削除)があります。

代わりに演算子をオーバーロードする場合は、やってくる貧しい人を混乱させ、なくなったらコードを維持する必要があります。

于 2013-03-23T18:37:06.537 に答える