[英]C# class += operator overload
我有一個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
的不同列表。 這很奇怪。
您要么必須放棄列表可變的要求,+ / - 不會導致副作用,或者期望+ =不會創建新列表。 當然,在框架中,委托有這些運算符,它們是不可變的。 代理的+/-行為是該語言中比較混亂的部分之一,因此我不主張您模仿它。
我將采用實現添加/刪除方法的正常途徑,語義是眾所周知的並且可以很容易地預測。
列表是非常常見的通用類,因此具有眾所周知的方法,通過這些方法可以將事物添加到其中或從中刪除(即添加和刪除)。
如果你過度操作運算符,你只會把那些可能出現的窮人混淆,並且一旦你離開就必須維護你的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.