2011-05-02 74 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

相关问题