1

考虑这个类

class SomeObject
{
        private int x;
        public int X
        {
            get { return x; }
            set { x = value+z; }
        }

        private int y;
        public int Y
        {
            get { return y; }
            set { y = value+z ; }
        }

        private int z;
        public int Z
        {
            get {return z;}
            set { z = value+y ; }
        }
    }

当我做类似的事情时

var r = new SomeObject() {X = 1, Y = 1, Z = 1 };
Console.WriteLine(r.X + " " + r.Y + " " + r.Z);

var r1 = new SomeObject() { Y = 1, X = 1, Z = 1 };
Console.WriteLine(r1.X + " " + r1.Y + " " + r1.Z);

var r2 = new SomeObject() { Z = 1, X = 1, Y = 1 };
Console.WriteLine(r2.X + " " + r2.Y + " " + r2.Z);

控制台输出

1 1 2
1 1 2
2 2 1

除了使用构造函数之外,还有其他方法可以解决此问题吗?

正确的输出应为2 2 2

每个答案都很有帮助,但我不能将它们都标记为最佳答案

4

3 回答 3

4

您可以始终仅在 getter 中计算它,而不是将值与因变量一起存储。这样他们设置的顺序就无关紧要了。例如

    private int y;
    public int Y
    {
        get { return y +z; }
        set { y = value ; }
    }

其他属性也类似。

但是我必须补充一点,您试图通过属性实现的目标是违反直觉的,并且对于遇到此问题的任何其他程序员来说可能是个问题。

于 2013-10-31T08:30:50.203 回答
2

没有问题。完全正确的行为。当您Z首先设置时,它将按您的预期工作。否则Z在您设置其他属性时为 0,而value + Z == value.
只需使用构造函数:

public SomeObject(int x, int y, int z)
{
   this.x = x + z;
   this.y = y + z;
   this.z = z + y;
}

您始终可以使用命名参数:

var r = new SomeObject(x: 1, z: 1, y: 1);
于 2013-10-31T08:30:59.667 回答
2

这很糟糕,不要修改set访问器中的值。

如果我设定价值Y = 10,我希望看到它10回来。

我会用只读属性做这样的事情

public int XModified
{
    get { return x + z; }
}

等等。

于 2013-10-31T08:36:53.820 回答