我已阅读文章Global Variables Are Bad,我有一些问题:
假设我有几个变量,例如:
int loops
此变量应该可以从代码中的任何位置访问,因此我有2个选项:
public static class Loops { public static int loops {get; set;} }
这样做的正确方法是什么,两者之间有什么区别?
答案 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的变量(因为变量不能存在于类或结构之外)。避免这些全局变量的等价物是将它们声明为具有适用于get
和set
访问器的适当范围的属性。
答案 4 :(得分:0)
声明全局变量不尊重OOP的任何基本原则;整个程序可以读取它并可能修改它(除非这是你想要的)。解决方案是使用private static int loops {get; set;}