C#class + =运算符重载

时间:2013-03-23 18:02:54

标签: c# oop operator-overloading

我有一个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#?

5 个答案:

答案 0 :(得分:6)

here你不能直接重载+ =但请注意评论:

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

因此,如果您只重载应该没问题的+运算符

答案 1 :(得分:2)

您不能将+=运算符重载为a += b,它只是a = a + b的简写。

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

答案 2 :(得分:1)

您无法重载+=,但它会使用+运算符进行分配,因此只要您覆盖+它就可以运行。

答案 3 :(得分:-1)

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

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

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

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

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

您要么必须删除列表可变的要求,+ / - 不会导致副作用,或者期望+ =不会创建新列表。当然,在框架中,委托有这些运算符,它们是不可变的。代理的+/-行为是该语言中比较混乱的部分之一,所以我不主张你模仿它。

我会采用实现添加/删除方法的正常途径,语义是众所周知的,并且可以很容易地预测。

答案 4 :(得分:-2)

列表是非常常见的泛型类,因此具有众所周知的方法,可以通过这些方法添加或删除它们(即添加和删除)。

如果你过度操作运算符,那么你就会把那些将要出现的穷人混淆,并且一旦你离开就必须维护你的代码。