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#中做到这一点呢?
从这里你不能直接重载+=,但请注意注释:
Assignment operators cannot be overloaded, but +=, for example, is evaluated using +, which can be overloaded
如果你只重载+
运算符那应该没问题
您不能将+=
操作符重载为a += b
,它只是a = a + b
的简写。
重载+
操作符将允许您在对象上使用+=
。
您不能重载+=
,但它使用+
操作符进行赋值操作,因此只要您重写+
,它应该可以工作。
我建议不要对这些操作实现+/-。在许多情况下,它会导致用法混乱。假设您的列表是可变的(这就是您想要添加和删除操作的原因),定义+/-就变得棘手了。有几个问题需要考虑。
一个要求是+
不应该引起副作用。如果var z = x + y
突变了x
或y
,那将是非常奇怪的。因此,必须在+/-中创建新的列表。大多数开发人员都不希望发生这种情况,而且每次添加一个项目时都要复制这些项目,这将是非常昂贵的。
假设你可以忍受每次添加/删除时的复制。在执行了这个片段之后,你期望程序的状态是什么呢?
var list1 = new MyList();
var list2 = list1;
list2 += item;
大多数人会期望list1
和list2
引用现在包含item
的同一个列表对象。但是,由于+
创建了一个新列表,因此不会发生这种情况。list1
为空,list2
是包含item
的另一个列表。这很奇怪。
您必须放弃列表是可变的,+/-不会产生副作用的要求,或者+=不会创建新列表的期望。当然,在框架中委托有这些操作符,并且它们是不可变的。委托的+/-行为是该语言中比较令人困惑的部分之一,所以我不建议您模仿它。
我将采用正常的方法实现Add/Remove方法,这些方法的语义是众所周知的,并且可以很容易地预测。
列表是非常常见的泛型类,因此具有众所周知的方法,可以通过这些方法向列表中添加或删除内容(即Add和Remove)。
如果你重载操作符,你只会把随之而来的可怜的家伙弄得晕头转向,一旦你离开,他们就不得不维护你的代码。