перегрузка ++ C # - PullRequest
       9

перегрузка ++ C #

1 голос
/ 05 мая 2011
public static MyClass operator++(MyClass op)
{
    MyClass result = new MyClass(); // MyClass() x=y=z=0; 

    result.x = op.x + 1;
    result.y = op.y + 1;
    result.z = op.z + 1;

    return result:
}

//...

public void Main()
{
    MyClass c = new MyClass();
    MyClass b = new MyClass(1,2,3); //ctor x = 1, ...
    c = b++;
}

Вопрос в том, почему переменная b будет меняться?потому что result.x = op.x + 1; не должно меняться op.x результат на самом деле c это (1,2,3) b это (2,3,4) Я не понимаю, почему не c это (2,3,4) и b это (1,2,3)

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Поведение, которое вы описываете, соответствует документации :

операция приращения постфикса - Результатом операции является значение операнда до его приращения.1006 *

И b++ (оператор постфикса), и ++b (оператор префикса) изменяют исходную переменную.Чтобы получить желаемые результаты, я бы предложил перегрузить оператор + и изменить c = b++; на c = b + 1;

0 голосов
/ 06 мая 2011

Вы говорите, "потому что result.x = op.x + 1 не должен изменять op.x."Но ++ это не так же, как + 1.Это стандартный постфиксный оператор приращения, который увеличивает операнд b с помощью вашей пользовательской перегрузки - он присваивает новое значение b сразу после , передавая предыдущее значение c.Если бы это был префиксный оператор (++b), он увеличился бы до , передав значение в c.

Без каких-либо перегрузок, код:

b++

Эквивалентно:

b = b + 1

А

c = b++ 

Эквивалентно:

c = b;
b = b + 1;

Теперь, используя вашу перегрузку, это больше эквивалентно:

c = b;
b = call_your_++_overload(b);
...