2013-03-23 3 views
3

У меня есть сценарий C#, который требует, чтобы элемент был добавлен или удален из списка. Я думал, что было бы лучше использовать операторы + = и - =.C# class + = перегрузка оператора

В 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#. Я думаю, вы обнаружите, что использование +/- для представления списка add/remove станет неудобным или неожиданным побочным эффектом. –

ответ

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

Списки очень распространены, общие классы и, как таковые, имеют известные методы, с помощью которых вещи могут быть добавлены или удалены из них (а именно, Add and Remove).

Если вы перегружаете операторов, вы просто сбиваете с толку бедного парня, который придет и должен будет сохранить ваш код, как только вы уйдете.

-1

Я бы не предлагал +/- для этих операций. Во многих случаях это приведет к запутанному использованию. Предполагая, что ваш список изменен (поэтому вы хотите добавлять и удалять операции), определение +/- становится сложным. Есть несколько вопросов, о которых стоит подумать.

Обязательным условием является то, что + не должен вызывать побочные эффекты. Было бы очень странно, если бы var z = x + y мутировал x или y. Следовательно, вы должны создать новый список внутри +/-. Большинство разработчиков не ожидали, что это произойдет, и будет очень дорого копировать элементы при каждом добавлении.

Предположим, вы можете жить с копированием при каждом добавлении/удалении. Что бы ожидать, что состояние программы будет после выполнения этого фрагмента:

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

Большинство было бы ожидать, что list1 и list2 ссылаться на тот же объект списка, который теперь имеет item в нем. Однако, поскольку + создает новый список, это не то, что происходит. list1 пуст и list2 - это другой список, который содержит item. Это очень странно.

Вам либо нужно отказаться от требования, чтобы список был изменен, +/- не вызвал побочных эффектов, либо ожидание того, что + = не будет создавать новый список. Конечно, в рамках делегатов есть эти операторы, и они неизменяемы. Поведение +/- для делегатов является одной из наиболее запутанных частей языка, поэтому я не буду выступать за то, чтобы вы его подражали.

Я бы пошел обычным путем реализации методов добавления/удаления, которые хорошо известны и легко могут быть предсказаны.

Смежные вопросы