2014-04-19 221 views
0

我读过这篇文章Global Variables Are Bad和我有一些问题:全局变量问题

认为我有几个变量,例如:

int loops 

这个变量应便于从代码的任何地方,所以我有2种选择:

  1. 定义我的主要形式,这里面变量作为全球
  2. 定义类:
public static class Loops 
{ 
    public static int loops {get; set;} 
} 

怎样做正确的方式,什么是两者之间的区别是什么?

回答

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;} 
} 

内BAL公共变量使用这个变量你需要的MyForm的类的实例,如果你有两个实例,你有两个不同的变量。

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

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

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

我的建议是将它们限制在一个很好理解的类中,并带有明确的属性支持字段,以便在未来发生变化时能够保持最大的灵活性。当然,文档在这里起着关键的作用

+0

那么你的建议?在新课堂还是在我的形式?问题是我有几个变量(大约15),因此我认为在我的表单中使用所有这些变量作为全局变得很丑陋 – user3328870

+0

正如我在更新的答案中所说的那样,这取决于。如果你不需要他们在表格外,那么在表格内使他们全球化,但不公开。如果它们与你的表格代码没有严格关联,那么全球课程更可取。还取决于你如何设计你的代码。通常用户界面和底层逻辑之间的关注点是必须的。有一种形式应该从我所站的地方分享一些可变的气味,但我不知道你的生意。 – Steve

+0

为什么不添加应用程序配置文件? – Andrew

0

这取决于我的朋友,似乎你的第一个选择它不是全球性的,如果你想要在表单中的每一处使用,在这种情况下,表单将成为你的上下文。在类中使用静态变量(public和NOT嵌套类)是一个真正的全局变量,应该谨慎使用,并且有一个很好的目的。

0

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

0

声明一个全局变量并不尊重任何OOP的基本原理;整个程序可以读取它,也可以修改它(除非这是你想要的)。解决的办法是做一个类与private static int loops {get; set;}

1

假设你有一个业务逻辑的项目,UI层会消耗它并有一个引用它。如果您的业务逻辑依赖于您的表单类中的loops,那么您不仅不能添加循环引用,而且如果我们在此讨论OOP,BL不直接依赖于UI。

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

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

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

  • 通过在<appSettings>标记内添加条目(如<add key="loops" value="10" />)来编辑该文件。

  • 添加到System.Configuration DLL的引用在您的项目,并使用ConfigurationManager 喜欢引用在配置中loops设置:

    ConfigurationManager.AppSettings["loops"]