2011-05-02 88 views
0

我想在對象初始值設定項內引用對象的屬性。問題是這個變量還不存在,所以我不能像普通的(object.method)那樣引用它。我不知道在對象初始化期間是否有關鍵字引用創建中的對象。訪問C#對象初始值設定項內的屬性讀取值

當我編譯下面的代碼時,我得到錯誤 - 名稱'寬度'在上下文中不存在。我明白爲什麼我得到這個錯誤,但我的問題是:有沒有任何語法來做到這一點?

public class Square 
{ 
    public float Width { get; set; } 
    public float Height { get; set; } 
    public float Area { get { return Width * Height; } } 
    public Vector2 Pos { get; set; } 

    public Square() { } 
    public Square(int width, int height) { Width = width; Height = height; } 
} 

Square mySquare = new Square(5,4) 
{ 
    Pos = new Vector2(Width, Height) * Area 
}; 

我想根據「mySquare」來引用屬性「寬度」,「高度」和「區域」。

+0

看代碼,因爲它使用的是'Square'實例的內部狀態設定它應該是一個只讀屬性。你怎麼看? – shahkalpesh 2011-05-02 07:16:05

+0

這只是一個愚蠢的例子,我展示了我的想法。根據班級的目的,我會說你可能是正確的,但我很可能不會創建一個班級有一個不可變的方形:) – 2011-05-02 07:18:42

+0

我建議使用只讀屬性的'矢量'而不是'方形'。 – shahkalpesh 2011-05-02 07:20:31

回答

1

你不能這樣寫,但你可以定義Pos屬性來做同樣的事情。取而代之的

public Vector2 Pos { get; set; } 

做到這一點

public Vector2 Pos 
{ 
    get 
    { 
     return new Vector2(Width, Height) * Area; 
    } 
} 

當然,那麼任何方有Pos相同的定義。不知道這是你想要的。

編輯基於

您的評論我想你希望能夠deferently指定不同的廣場Pos的值。這是另一個想法。您可以將第三個參數添加到需要委託的構造函數中,然後構造函數可以在內部使用該委託來設置該屬性。然後當你創建一個新的方塊時,你只需傳入一個lambda表達式就可以了。事情是這樣的:

public Square(int width, int height, Func<Square, Vector2> pos) 
{ 
    Width = width; 
    Height = height; 
    Pos = pos(this); 
} 

然後

Square mySquare = new Square(4, 5, sq => new Vector2(sq.Width, sq.Height) * sq.Area); 
+0

謝謝,不幸的是,這不是我想要的,但你是正確的,根據[this](http:// stackoverflow。 COM /問題/ 3564626/C-對象初始化劑引用到的新實例) – 2011-05-02 07:26:26

相關問題