我希望在整个项目中都可以访问一些全局变量,不管在哪个表单中都能够使用。我该怎么做?
你可以使用静态类来实现这个目的。 像这样:
static class Global
{
private static string _globalVar = "";
public static string GlobalVar
{
get { return _globalVar; }
set { _globalVar = value; }
}
}
并且在任何你可以编写的地方使用:
GlobalClass.GlobalVar = "any string value"
在这里达成共识的是将全局变量作为静态成员放入静态类中。当您创建一个新的Windows Forms应用程序时,它通常会带有一个Program类(Program.cs),它是一个静态类,并且作为应用程序的主入口点。它在整个应用程序的生命周期内存在,因此我认为最好将全局变量放在那里,而不是创建一个新的类。
static class Program
{
public static string globalString = "This is a global string.";
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
并像这样使用:
public partial class Form1 : Form
{
public Form1()
{
Program.globalString = "Accessible in Form1.";
InitializeComponent();
}
}
或者您可以将全局变量放在app.config中。
一种方法是,
在解决方案资源管理器中找到您的项目,然后进入“属性”>“设置”>“Settings.Settings”。单击此文件并从IDE中定义您的设置。
通过以下方式访问它们:
Properties.Settings.Default.MySetting = "hello world";
//Program.cs
public class Forms : Form
{
//Declare your global valuables here.
}
//Form1.cs
public partial class Form1 : Forms //Change from Form to Forms
{
//...
}
public static class MyGlobals
{
public static string Global1 = "Hello";
public static string Global2 = "World";
}
public class Foo
{
private void Method1()
{
string example = MyGlobals.Global1;
//etc
}
}
int
,enum
等,如果它们是全局/静态的,直到结束程序它们才不会被销毁)。问题在于很难知道全局(或静态)变量的构建顺序。原则上,这是不确定的。如果所有的全局/静态变量都在一个编译单元中(也就是说,你只有一个.cpp
),那么构建顺序就与书写顺序相同(即,在之前定义的变量先构建)。.cpp
文件,全局构造顺序是不确定的。当然,每个编译单元(每个.cpp
)中的顺序是被尊重的:如果全局变量A
在B
之前定义,A
将在B
之前创建,但是其他.cpp
的变量可能在A
和B
之间初始化。例如,如果你有三个具有以下全局/静态变量的单元:
在可执行文件中,它可以按照这个顺序创建(或按照任何其他顺序,只要相对顺序在每个.cpp
内得到尊重):
询问其他同事后,发现在开始收集过程之前必须“标记为真”,即一个全局布尔值,表示我们是否处于测试模式。提供支付服务的对象依赖于另一个提供支付方式的对象,并且该依赖关系以程序员看不见的方式发生。
换句话说,全局变量(或单例)使得无法进入“测试模式”,因为不能将全局变量替换为“测试”实例(除非修改创建或定义该代码的代码)。我们假设测试是在母代码没有修改的情况下进行的。
这可以通过所谓的*依赖注入*来解决,它包括在构造函数或相应方法中传递对象需要的所有依赖项作为参数。这样,程序员可以**看到**他需要编写的代码,从而使开发人员节省了大量时间。
如果有太多的全局对象,并且需要它们的函数参数也很多,那么您可以始终将您的“全局对象”分组到一个类中,样式为*工厂*,该类构建并返回您想要的“全局对象”(模拟),将工厂作为参数传递给需要全局对象作为依赖项的对象。
如果您进入测试模式,可以始终创建一个测试工厂(返回相同对象的不同版本),并将其作为参数传递,而无需修改目标类。任何其他事情,即使它的生命周期几乎与程序相同,也始终将其作为参数传递。即使变量在模块中是全局的,在没有任何其他访问的情况下仅在其中,但在任何情况下,依赖关系始终作为参数存在。
回答者:Peregring-lk