2013-03-23 133 views
3

我有一个C#脚本,需要将项目添加到列表或从列表中删除。我认为使用+ =和 - =运算符会更好。C#class + = operator overload

在C#中的操作是通过做:

public Foo operator +(Foo A, Foo B){ 
    //Some adding code; 
    return C; 
} 

但是我只得到一个语法错误,当我尝试:

public SpriteValues operator +=(SpriteValues A){ 
    //Add A to this 
    return this; 
} 

我知道蟒蛇会使用来实现:

def __iadd__(self, A): 
    #Add A to this 
    return self 

那么我该如何在C#中做到这一点?

+2

顺便说一下,在C#中不鼓励使用这种操作符。我认为你会发现使用+/-来表示列表添加/删除将变得尴尬或有意想不到的副作用。 – 2013-03-23 18:20:39

回答

6

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

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

所以,如果你只重载+操作者应该罚款

2

你不能重载+=操作作为a += b它只是a = a + b的简写。

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

1

您不能超载+=,但它利用+运算符进行赋值,所以只要您覆盖+它应该可以工作。

-2

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

如果你让运营商超负荷运行,那么你只会混淆掉那个可怜的家伙,一旦你离开后必须维护你的代码。

-1

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

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

假设您可以在每次添加/删除时进行复制。你所期望的程序的状态为执行该片段后:

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

大多数人会想到,list1list2指现在有它item同一个列表对象。但是,由于+创建了一个新列表,这不会发生。 list1为空,list2是包含item的不同列表。这很奇怪。

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

我会去执行添加/删除方法的正常路由谁的语义是众所周知的,可以很容易地预测。