2013-10-31 43 views
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

每一个答案是有帮助的,但我不能坊间他们都为最佳答案

+1

那么它做工不错,当你initalizing特定变量的另外一些是作为** 0 **,我真的不知道这是可能的,但你可以尝试使用'INotifyPropertyChanged'约束他们,这样他们就可以* *每变化一次后,适应**每个变量的大部分实际值。有关此接口检查的更多信息:http://msdn.microsoft.com/en-us/library/ms743695.aspx – Tafari

回答

4

而是存储与因变量的值,你总是可以计算它只有在吸气。这样他们得到设置的顺序就不重要了。例如

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

和其他属性的类似。

但是我必须补充一点,你试图通过属性来实现的东西是违反直觉的,并且可能成为任何其他程序员碰到的问题。

+0

这是否也意味着更少的内存使用量? – FPGA

+0

@ user1492051否这不会对内存使用造成任何影响。您仍然将值存储在单独的变量中。你有任何理由担心内存使用情况吗?你究竟想要做什么? – hawk

+0

不,只是想知道 – FPGA

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); 
2

这是可怕的,不set访问修改值。

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

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

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

等。