我有一个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#?
答案 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
变异x
或y
,那将会非常奇怪。因此,您必须在+/-内创建新列表。大多数开发人员都不希望这种情况发生,每次添加项目时复制项目都会非常昂贵。
假设您可以在每次添加/删除时复制。在执行此片段后,您期望程序的状态是什么:
var list1 = new MyList();
var list2 = list1;
list2 += item;
大多数人希望list1
和list2
能够引用现在包含item
的同一个列表对象。但是,由于+
创建了一个新列表,因此不会发生这种情况。 list1
为空,list2
是包含item
的其他列表。这很奇怪。
您要么必须删除列表可变的要求,+ / - 不会导致副作用,或者期望+ =不会创建新列表。当然,在框架中,委托有这些运算符,它们是不可变的。代理的+/-行为是该语言中比较混乱的部分之一,所以我不主张你模仿它。
我会采用实现添加/删除方法的正常途径,语义是众所周知的,并且可以很容易地预测。
答案 4 :(得分:-2)
列表是非常常见的泛型类,因此具有众所周知的方法,可以通过这些方法添加或删除它们(即添加和删除)。
如果你过度操作运算符,那么你就会把那些将要出现的穷人混淆,并且一旦你离开就必须维护你的代码。