前几天,我遇到了一个关于C#属性的小问题。
假设我有这样的设置:
public class Point
{
public float X;
public float Y;
}
public class Control
{
protected Point m_Position = new Point();
public Point Position
{
get { return m_Position; }
set
{
m_Position = value; }
// reorganize internal structure..
reorganize();
}
protected reorganize()
{
// do some stuff
}
}这一切都很好,但是当涉及到用法时,我可以这样写:
Control myControl = new Control();
myControl.Position.X = 1.0f;问题是,我的Control类无法识别Position已被更改,因为set()尚未被调用。
有没有办法让Control意识到Position的任何变化?
发布于 2010-04-22 20:20:00
在这种情况下,有许多选项:
在这种情况下,我建议选择#1
发布于 2010-04-22 20:22:05
语句myControl.Position.X = 1.0f;实际上调用的是Position属性的getter,而不是setter。一种做你想做的事情的方法是直接在你的类上公开X和Y值,如下所示:
public class Control
{
protected Point m_Position = new Point();
public float PositionX
{
get { return m_Position.X; }
set
{
m_Position.X = value; }
// reorganize internal structure..
reorganize();
}
... Same thing for PositionY
protected reorganize()
{
// do some stuff
}
}另一种方法是在Position类上实现一些事件,该事件在每次X或Y更改时引发。这需要将X和Y设置为Point对象的属性,并在每次更改它们时引发一个事件。然后,您的控件必须订阅该事件。
发布于 2010-04-22 20:20:37
1)设置Point.X和Point.Y私有。2)将X和Y的属性添加到Point。3)向Point添加一个事件,该事件在修改X或Y时引发。4)将Control注册为Point引发的事件的侦听器。
https://stackoverflow.com/questions/2690629
复制相似问题