c# class +=操作符重载

本文关键字:操作符 重载 class | 更新日期: 2023-09-27 18:05:43

我有一个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#中做到这一点呢?

c# class +=操作符重载

从这里你不能直接重载+=,但请注意注释:

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

如果你只重载+运算符那应该没问题

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

重载+操作符将允许您在对象上使用+=

您不能重载+=,但它使用+操作符进行赋值操作,因此只要您重写+,它应该可以工作。

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

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

假设你可以忍受每次添加/删除时的复制。在执行了这个片段之后,你期望程序的状态是什么呢?

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

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

您必须放弃列表是可变的,+/-不会产生副作用的要求,或者+=不会创建新列表的期望。当然,在框架中委托有这些操作符,并且它们是不可变的。委托的+/-行为是该语言中比较令人困惑的部分之一,所以我不建议您模仿它。

我将采用正常的方法实现Add/Remove方法,这些方法的语义是众所周知的,并且可以很容易地预测。

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

如果你重载操作符,你只会把随之而来的可怜的家伙弄得晕头转向,一旦你离开,他们就不得不维护你的代码。