实例变量放置?

时间:2013-06-05 17:06:55

标签: c# coding-style

我只是对实例变量展示位置有一个小问题。

示例:

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
}

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

此外,如果有另一种方法可以在没有实例变量的情况下实现相同的功能,我很乐意了解它。

4 个答案:

答案 0 :(得分:7)

  

我的问题是:变量“_prevMousePosition”是否按照惯例放在类的顶部,或者它是否直接位于方法的顶部,如下所示:

这纯粹是个人偏好。编译器不在乎放置它的位置。将它置于方法之上是完全有效的C#,并且不会引起任何问题。

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

答案 1 :(得分:1)

要特别警惕为单个方法保留状态的类字段。考虑:

  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;
    

答案 2 :(得分:-1)

如果将它放入MouseMove事件中,一旦超出范围,您将丢失该值。它应该放在班级。

答案 3 :(得分:-1)

与核心“实例变量展示位置无关”?问题

“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();
        }
    }

}