簡體   English   中英

C#class + =運算符重載

[英]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突變xy那將是非常奇怪的。 因此,您必須在+/-內創建新列表。 大多數開發人員都不希望這種情況發生,每次添加項目時復制項目都會非常昂貴。

假設您可以在每次添加/刪除時復制。 在執行此片段后,您期望程序的狀態是什么:

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

大多數人都希望list1list2引用同一個列表對象,該列表對象現在具有item 但是,由於+創建了一個新列表,因此不會發生這種情況。 list1為空, list2是包含item的不同列表。 這很奇怪。

您要么必須放棄列表可變的要求,+ / - 不會導致副作用,或者期望+ =不會創建新列表。 當然,在框架中,委托有這些運算符,它們是不可變的。 代理的+/-行為是該語言中比較混亂的部分之一,因此我不主張您模仿它。

我將采用實現添加/刪除方法的正常途徑,語義是眾所周知的並且可以很容易地預測。

列表是非常常見的通用類,因此具有眾所周知的方法,通過這些方法可以將事物添加到其中或從中刪除(即添加和刪除)。

如果你過度操作運算符,你只會把那些可能出現的窮人混淆,並且一旦你離開就必須維護你的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM