实例变量放置

本文关键字:变量 实例 | 更新日期: 2023-09-27 18:16:59

我只是有一个关于实例变量位置的小问题。

的例子:

private void example_MouseMove(object sender, MouseEventArgs e){
    //do stuff
}

c#中的鼠标移动事件一直在轮询。有时,我可能希望仅在鼠标位置完全移动到另一个像素时才运行其中的代码。所以我可以这样写:

private void example_MouseMove(object sender, MouseEventArgs e){
    if (_prevMousePosition == Cursor.Position) return;
    //Do stuff
}

我的问题是:变量"_prevMousePosition"是否像往常一样位于类的顶部,或者它是否直接位于方法的顶部,像这样:

private Point _prevMousePosition = new Point(0, 0);
private void example_MouseMove(object sender, MouseEventArgs e){
    if (_prevMousePosition == Cursor.Position) return;
    //Do stuff
}

我觉得它应该位于方法的顶部,因为它将被访问的唯一地方是事件,它在方法之外的唯一目的是保留以前的鼠标位置。

另外,如果有另一种方法可以在没有实例变量的情况下实现相同的功能,我很想知道。

实例变量放置

我的问题是:变量"_prevMousePosition"是否像往常一样位于类的顶部,或者它是否直接位于方法的顶部,像这样:

这纯粹是个人偏好。编译器并不关心你把它放在哪里。将它置于方法之上是完全有效的c#,并且不会引起任何问题。

c#代码的大多数标准约定(包括由诸如StyleCop之类的工具强制执行的约定)建议将字段与所有其他字段一起放在类的顶部。这样做的好处是,您可以轻松地浏览类并查看所有本地存储的数据,以及确保正确初始化等。

要特别小心那些为单个方法保留状态的类字段。考虑:

  1. 创建一个单独的类来处理鼠标动作和保存状态(历史)
  2. 给你的类一个单独的类的私有实例
  3. 实例上订阅一些方法来处理example.MouseMove事件
  4. 在您的类中编写处理程序,以订阅上的实例
  5. 上的高级事件。

这将避免决定在哪里放置高度本地化的字段的问题。


例如:

class MouseTracker
{
    private Point _prevMousePosition = new Point(0, 0);
    //Maybe define some higher-level events here
    public event ... MouseMoveWithHistory;
    public void HandleMouseMove(object sender, MouseEventArgs e)
    {
        if (_prevMousePosition == Cursor.Position) return;
        //Do stuff
        //Trigger higher level events
    }
}

然后,在你的课堂上:

private MouseTracker tracker = new MouseTracker();
...
//in your constructor
example.MouseMove += tracker.HandleMouseMove;
tracker.MouseMoveWithHistory += tracker_SomeLocalHandler;

如果将其放入MouseMove事件中,则一旦超出范围,就会失去该值。应该放在类级别

与核心"实例变量放置?"问题无关

" c#中的鼠标移动事件一直在轮询。有时,我可能希望仅在鼠标位置完全移动到另一个像素时才运行其中的代码。"

啊? !…它不会触发"部分像素"…如果这是真的。当你有一个基于整个像素的新位置时,它会触发。如果您离开表单,然后在同一点重新输入,或者如果焦点切换然后返回并且光标没有移动,则可能具有相同的位置。可能还有其他条件……但是你真的测试过新职位与前一个职位匹配的频率吗?我不知道你在做什么,但这在我的系统上不经常发生:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.MouseMove += new MouseEventHandler(example_MouseMove);
        listBox1.MouseMove += new MouseEventHandler(example_MouseMove);
        this.Shown += new EventHandler(Form1_Shown);
    }
    void Form1_Shown(object sender, EventArgs e)
    {
        _prevMousePosition = Cursor.Position;
    }
    private int counter = 0;
    private Point _prevMousePosition = new Point(0, 0);
    private void example_MouseMove(object sender, MouseEventArgs e)
    {
        if (_prevMousePosition == Cursor.Position)
        {
            counter++;
            listBox1.Items.Add(counter.ToString() + ": " + _prevMousePosition.ToString());
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
        }
        else
        {
            _prevMousePosition = Cursor.Position;
            this.Text = _prevMousePosition.ToString();
        }
    }
}