2013-10-31 166 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; } 
} 

等。