考虑这个课程
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
每个答案都有帮助,但我不能将它们全部作为最佳答案
答案 0 :(得分:4)
不是将值与因变量一起存储,而是始终只能在getter中计算它。这样他们设定的顺序无关紧要。例如
private int y;
public int Y
{
get { return y +z; }
set { y = value ; }
}
和其他属性类似。
但是我必须补充一点,你试图通过属性实现的是反直觉的,对于遇到这种情况的任何其他程序员来说都是个问题。
答案 1 :(得分:2)
没有问题。完全正确的行为。当您首先设置Z
时,它将按预期工作。否则,当您设置其他属性和Z
时,value + Z == value
为0。
只需使用构造函数:
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);
答案 2 :(得分:2)
这很糟糕,请勿修改set
访问者中的值。
如果我设置了值Y = 10
,我希望看到10
返回。
我会用readonly属性做这样的事情
public int XModified
{
get { return x + z; }
}
等等。