Я бы не предлагал +/- для этих операций. Во многих случаях это приведет к запутанному использованию. Предполагая, что ваш список изменен (поэтому вы хотите добавлять и удалять операции), определение +/- становится сложным. Есть несколько вопросов, о которых стоит подумать.
Обязательным условием является то, что +
не должен вызывать побочные эффекты. Было бы очень странно, если бы var z = x + y
мутировал x
или y
. Следовательно, вы должны создать новый список внутри +/-. Большинство разработчиков не ожидали, что это произойдет, и будет очень дорого копировать элементы при каждом добавлении.
Предположим, вы можете жить с копированием при каждом добавлении/удалении. Что бы ожидать, что состояние программы будет после выполнения этого фрагмента:
var list1 = new MyList();
var list2 = list1;
list2 += item;
Большинство было бы ожидать, что list1
и list2
ссылаться на тот же объект списка, который теперь имеет item
в нем. Однако, поскольку +
создает новый список, это не то, что происходит. list1
пуст и list2
- это другой список, который содержит item
. Это очень странно.
Вам либо нужно отказаться от требования, чтобы список был изменен, +/- не вызвал побочных эффектов, либо ожидание того, что + = не будет создавать новый список. Конечно, в рамках делегатов есть эти операторы, и они неизменяемы. Поведение +/- для делегатов является одной из наиболее запутанных частей языка, поэтому я не буду выступать за то, чтобы вы его подражали.
Я бы пошел обычным путем реализации методов добавления/удаления, которые хорошо известны и легко могут быть предсказаны.
Как в стороне, использование операторов таким образом не рекомендуется в C#. Я думаю, вы обнаружите, что использование +/- для представления списка add/remove станет неудобным или неожиданным побочным эффектом. –