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 += b它只是a = a + b.

重载+运算符将允许您+=在对象上使用。

于 2013-03-23T18:05:38.863 回答
1

您不能重载+=,但它使用+带有赋值的运算符,所以只要您覆盖+它就可以工作。

于 2013-03-23T18:06:16.740 回答
-1

我主张不要为这些操作实施 +/-。在许多情况下,它会导致使用混乱。假设您的列表是可变的(这就是您想要添加和删除操作的原因),定义 +/- 变得很棘手。有几个问题需要考虑。

一项要求是+不应引起副作用。如果var z = x + y发生突变xy. 因此,您必须在 +/- 内创建新列表。大多数开发人员不会期望这种情况发生,并且每次添加项目时复制项目将非常昂贵。

假设您可以忍受每次添加/删除时的复制。执行此片段后,您希望程序的状态是什么:

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

大多数人会期望这一点list1list2引用现在包含item在其中的相同列表对象。但是,由于+创建了一个新列表,因此不会发生这种情况。list1是空的,list2是一个不同的列表,其中包含item. 这很奇怪。

您要么必须放弃列表是可变的要求, +/- 不会导致副作用,或者 += 不会创建新列表的期望。当然,在框架中,委托具有这些运算符并且它们是不可变的。+/- 代表代表的行为是该语言中更令人困惑的部分之一,因此我不建议您效仿它。

我会走正常的路线来实现语义众所周知并且可以轻松预测的 Add/Remove 方法。

于 2013-03-23T18:49:29.300 回答
-2

列表是非常常见的通用类,因此具有众所周知的方法,可以通过这些方法向其中添加或删除内容(即添加和删除)。

如果你去重载操作符,你只会把这个可怜的家伙弄糊涂,一旦你离开了,你就必须维护你的代码。

于 2013-03-23T18:37:06.537 回答