全局变量问题

时间:2014-04-19 10:41:18

标签: c# .net winforms

我已阅读文章Global Variables Are Bad,我有一些问题:

假设我有几个变量,例如:

int loops

此变量应该可以从代码中的任何位置访问,因此我有2个选项:

  1. 将此变量定义为我的主窗体中的全局
  2. 定义类:
  3. public static class Loops 
    {
        public static int loops {get; set;} 
    }
    

    这样做的正确方法是什么,两者之间有什么区别?

5 个答案:

答案 0 :(得分:1)

静态类中的公共静态变量就像旧的全局变量一样。唯一的区别是您始终需要指定类名来访问其值。它在代码的每个部分都可用,它引用了包含静态类的程序集和命名空间。并且该变量只有一个值。

表单中的公共实例变量是一个变量,只有在构建表单实例时才存在,并且它与同一表单的其他实例中的任何其他变量不同。

例如

public static class GlobalAppVariables 
{ 
   public static int loops {get; set;} 
   ......
}

在项目或其他程序集的其他部分中正确引用定义程序集

for(int x = 0; x < GlobalAppVariables.loops; x++)

而是在表单类

中使用全局公共变量
public class MyForm : Form
{
   public int loops {get; set;}
}

要使用该变量,您需要一个MyForm类的实例,如果您有两个实例,则有两个不同的变量。

MyForm f = new MyForm();
f.loops = 15;
for(int x = 0; x < f.loops; x++)
    ......

MyForm f1 = new MyForm();
f1.loops = 100;
.....

从OOP的角度来看,对于每个非平凡的程序,你都应该努力避免全局变量。但这就是理论,在现实世界中有真正的约束(性能,开发时间,程序员专业知识,任务性质和其他考虑因素),并不总是可以完全避免它们。

我的建议是将它们限制在一个易于理解的类中,并使用明确的属性支持字段,以便在将来更改时提供最大的灵活性。当然,文档在这里起着关键作用

答案 1 :(得分:1)

假设您有一个包含业务逻辑的项目,UI层将使用它并引用它。如果您的业务逻辑依赖于表单类中的loops,那么您不仅不能添加循环引用,而且如果我们直接依赖于UI,那么BL不是一个好主意。在这里谈谈OOP。

如果将所有配置保留在您的Configuration类中,则第二个选项就足够了,但更改它意味着重新编译解决方案。

Application Configuration File是进行应用程序配置的正确方法:

  • 将“应用程序配置文件”项添加到项目中(右键单击项目&gt;添加项目)。这将在您的项目中创建一个名为app.config的文件。

  • 通过在<add key="loops" value="10" />代码中添加<appSettings>等条目来修改文件。

  • 在项目中添加对System.Configuration dll的引用,并使用loops引用配置中的ConfigurationManager设置 像:

    ConfigurationManager.AppSettings["loops"]

答案 2 :(得分:0)

这取决于我的朋友,似乎对于你的第一个选项它不是全局的,如果你想在表格中的每个地方使用,在这种情况下,表格成为你的背景。虽然在类(public和NOT Nested类)中使用静态变量是一个真正的全局变量,应该谨慎使用,并且有一个很好的目的。

答案 3 :(得分:0)

您引用的文章适用于C ++。在C ++中,全局变量是在类之外声明的变量。但是,在C#中,全局变量是在类中声明为public的变量(因为变量不能存在于类或结构之外)。避免这些全局变量的等价物是将它们声明为具有适用于getset访问器的适当范围的属性。

答案 4 :(得分:0)

声明全局变量不尊重OOP的任何基本原则;整个程序可以读取它并可能修改它(除非这是你想要的)。解决方案是使用private static int loops {get; set;}

创建一个类