首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#属性问题

C#属性问题
EN

Stack Overflow用户
提问于 2010-04-22 20:15:48
回答 5查看 211关注 0票数 6

前几天,我遇到了一个关于C#属性的小问题。

假设我有这样的设置:

代码语言:javascript
复制
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
  }
}

这一切都很好,但是当涉及到用法时,我可以这样写:

代码语言:javascript
复制
Control myControl = new Control();
myControl.Position.X = 1.0f;

问题是,我的Control类无法识别Position已被更改,因为set()尚未被调用。

有没有办法让Control意识到Position的任何变化?

EN

回答 5

Stack Overflow用户

发布于 2010-04-22 20:20:00

在这种情况下,有许多选项:

  1. 使Point类的X和Y属性不可变。也就是说,每当X或Y发生变化时,都需要用户创建一个新的Point。
  2. 在Point分类上设置一个事件,并在Position分类上订阅它。每当点的X或Y发生更改时,都会触发事件。Position类可以处理事件处理程序中的副作用。

在这种情况下,我建议选择#1

票数 7
EN

Stack Overflow用户

发布于 2010-04-22 20:22:05

语句myControl.Position.X = 1.0f;实际上调用的是Position属性的getter,而不是setter。一种做你想做的事情的方法是直接在你的类上公开X和Y值,如下所示:

代码语言:javascript
复制
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对象的属性,并在每次更改它们时引发一个事件。然后,您的控件必须订阅该事件。

票数 2
EN

Stack Overflow用户

发布于 2010-04-22 20:20:37

1)设置Point.X和Point.Y私有。2)将X和Y的属性添加到Point。3)向Point添加一个事件,该事件在修改X或Y时引发。4)将Control注册为Point引发的事件的侦听器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2690629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档