Winform变量范围

时间:2011-10-18 04:00:42

标签: c# winforms global-variables

在表单中将大多数变量放在类级别是不好的做法吗?这些会被视为全局变量吗?

public partial class Form1 : Form
{
    private string mode;
    private int x, y;

    public Form1()
    {
        InitializeComponent();
    }
}

当我在类级别声明它们时,我在多个控件中使用变量。

6 个答案:

答案 0 :(得分:4)

我从问题中得到的是,如果您使用的是不依赖于任何形式的个人形式,则所有这些变量都将成为该类的私有变量。如果表单是从其他地方调用的。然后它也将是私有变量。如果您真的想要进行清晰的设计,那么您可以在要向其他类公开的私有变量上创建公共属性。

通过这种方式,您可以通过创建只读属性将其他类的限制访问权限设置为私有变量,以便其他类无法修改但可以访问它。

答案 1 :(得分:2)

这些将被视为类级别的全局变量(以区别于应用程序全局变量。)在这种情况下,更重要的区别是它们是private类。

类级别的全局变量有它们的用途,所以我绝对不会称它为坏习惯。当您计划通过property accessors公开它们时,非常适合私有类全局变量。例如:

  • public readonly属性,其值由您班级内部的逻辑控制。

  • public属性同时包含setget个访问者(在setter中启用自定义验证逻辑。)

但是,我认为除非另有必要,否则将本地化为本地是一种好习惯。原因是你有一个属于类实例的可变状态较少,所以这样的bug可能性较小:

private int EvilMethod1() {  
    x = (int) Math.Pow((double) y, 2);
    return x;
} 

private int EvilMethod2() {  
    y = (x + y) * 2;                    
    return y;
}

// Assignments depend on the current values of x and y, 
// as well as yielding unexpected side effects.
private void PureEvil()
{
    // Return value depends on current y; has side effect on x while assigning y.
    y = EvilMethod1();  

    // Return value depends on current x and y; has side effect on y while assigning x.
    x = EvilMethod2(); 
}

答案 2 :(得分:2)

这些不被视为全局变量。它们仅在Form1类中是全局的,而不是整个程序。

答案 3 :(得分:1)

这取决于变量的用途。

如果它们仅在单一方法中使用,则它们应该是该方法的本地方法。

如果他们描述了类的状态并且在多个地方使用它们,则应将它们声明为类成员。

答案 4 :(得分:0)

他们是班级Form1

的私人

答案 5 :(得分:0)

如果不知道表单的意图是什么,很难说你所做的是好还是坏。此处显示的变量具有类范围,并且由于它们是私有的,因此它们不能在Form1之外访问,并且不被视为“全局”。

如果您真的想要全局变量,请创建一个带有私有静态变量和公共静态访问器/ mutators(C#中的属性)的静态类,并通过公共属性访问该变量。有关示例,请参阅this answer