C# - Winforms -全局变量

798qvoo8  于 2022-12-23  发布在  C#
关注(0)|答案(8)|浏览(208)

我希望一些变量在整个项目中是全局的,并且可以以任何形式访问。我该怎么做呢?

r8xiu3jd

r8xiu3jd1#

是的,你可以通过使用静态类.像这样:

static class Global
{
    private static string _globalVar = "";

    public static string GlobalVar
    {
        get { return _globalVar; }
        set { _globalVar = value; }
    }
}

以及使用任何可以写入以下内容的地方:

GlobalClass.GlobalVar = "any string value"
h9a6wy2h

h9a6wy2h2#

这里的共识是将全局变量作为静态成员放在静态类中。当您创建新的Windows窗体应用程序时,它通常附带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();
    }
}
vkc1a9a2

vkc1a9a23#

或者您可以将全局变量放在app.config

pxiryf3j

pxiryf3j5#

一种方式,
解决方案资源管理器〉您的项目〉属性〉设置。单击此文件并从IDE添加和定义您的设置。
访问方式

Properties.Settings.Default.MySetting = "hello world";
voj3qocg

voj3qocg6#

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

rbpvctlc7#

如果您使用的是Visual C#,则只需在Program.cs中添加一个继承Form的类,并将所有继承的类从Form更改为每个Form*. cs中的类。

//Program.cs
public class Forms : Form
{
    //Declare your global valuables here.
}

//Form1.cs
public partial class Form1 : Forms    //Change from Form to Forms
{
    //...
}

当然,extending the class Form without modifying it可能有一种方法。如果是这样的话,你所需要做的就是扩展它!因为默认情况下所有的表单都继承它,所以所有在它里面声明的有价值的东西都会自动变成全局的!祝你好运!!!

k10s72fa

k10s72fa8#

他们已经回答了如何使用全局变量。
我将告诉你为什么使用全局变量是一个坏主意,因为这个question是在西班牙语的stackoverflow中执行的。
案文的西班牙文译文如下:

变更的影响

全局变量的问题在于它们会产生隐藏的依赖关系。当涉及到大型应用程序时,你自己不知道/不记得/你清楚你所拥有的对象及其关系。
所以,你不可能清楚地知道你的全局变量使用了多少个对象。如果你想改变全局变量的某些东西,例如,它的每个可能值的含义,或者它的类型?这个改变会影响多少个类或编译单元?如果数量很小,那么可能值得做这个改变。如果影响很大,可能值得寻找另一种解决方案。
但是影响是什么呢?因为全局变量可以在代码中的任何地方使用,所以很难度量它。
此外,始终尝试使变量具有尽可能短的生存时间,以便使用该变量的代码量尽可能少,从而更好地了解其用途以及修改者。
全局变量在程序运行期间持续存在,因此,任何人都可以使用该变量,或者读取它,或者更糟的是,更改它的值,这使得更难知道该变量在任何给定的程序点将具有什么值。

销毁顺序

另一个问题是销毁的顺序,变量总是按照创建的相反顺序销毁,无论它们是局部变量还是全局/静态变量(一个例外是原语类型intenum s等,如果它们是全局/静态的,则在程序结束之前永远不会销毁)。
问题是很难知道全局(或静态)变量的构造顺序,原则上它是不确定的。
如果所有的全局/静态变量都在一个编译单元中(也就是说,只有一个.cpp),那么构造的顺序与编写的顺序相同(也就是说,前面定义的变量在前面构建)。
但是如果你有多个.cpp,每个都有自己的全局/静态变量,那么全局的构造顺序是不确定的。当然,每个编译单元(每个.cpp)的顺序是需要考虑的:如果全局变量AB之前定义,则A将在B之前构建,但有可能在AB之间初始化其他.cpp的变量。例如,如果您有三个具有以下全局/静态变量的单元:
Image1
在可执行文件中,它可以按以下顺序创建(或按任何其他顺序,只要在每个.cpp内遵守相对顺序):
Image2
为什么这很重要呢?因为如果不同的静态全局对象之间存在关系,例如,一些对象在它们的析构函数中使用其他对象,也许在一个全局变量的析构函数中,你使用了来自另一个编译单元的另一个全局对象,而这个对象已经被销毁了(是后来构建的)。

隐藏的依赖项和 * 测试用例 *

我试着找到我将在这个例子中使用的源代码,但是我找不到它(无论如何,它是为了举例说明单例的使用,尽管这个例子适用于全局变量和静态变量)隐藏的依赖关系也会产生与控制对象行为有关的新问题,如果它依赖于全局变量的状态。
假设您有一个支付系统,并且您希望测试它以了解它如何工作,因为您需要进行更改,而代码来自另一个人(或者你的,不过是几年前的),你打开一个新的main,调用你的全局对象的对应函数,这个全局对象提供一个银行卡支付服务,结果你输入你的数据,他们就向你收费。在一个简单的测试中,我是如何使用生产版本的?我如何做一个简单的支付测试?
在询问了其他同事之后,结果是在开始收集过程之前,您必须“标记为true”,这是一个全局布尔值,指示我们是否处于测试模式。您提供支付服务的对象依赖于另一个提供支付模式的对象,而这种依赖性对程序员来说是以一种不可见的方式发生的。
换句话说,全局变量(或单例),使它不可能传递到“测试模式”,因为全局变量不能被替换为“测试”示例(除非你修改代码的地方说,代码被创建或定义)。全局变量,但我们假设测试是在不修改母代码的情况下完成的)。

溶液

这个问题可以通过所谓的“依赖注入”来解决,这种方法是将一个对象在其构造函数或相应的方法中所需要的所有依赖性作为参数传递。这样,程序员就可以看到自己身上发生的事情,因为他必须用代码来编写它,从而使开发人员获得了大量的时间。
如果有太多的全局对象,并且需要它们的函数中有太多的参数,你总是可以将你的“全局对象”分组到一个类style * factory * 中,这个类构建并返回你想要的“全局对象”(模拟的)的示例,将工厂作为参数传递给需要全局对象作为依赖的对象。
如果您传递到测试模式,您总是可以创建一个测试工厂(它返回相同对象的不同版本),并将其作为参数传递,而不必修改目标类。
∮ ∮但它总是坏的吗?∮
不一定,全局变量可能有很好的用途。例如,常量值 (PI值)。作为一个常数值,不存在由于来自另一个模块的任何类型的修改而不知道其在程序中给定点的值的风险。此外,常数值 倾向于原始的并且不太可能改变它们的定义。
在这种情况下,使用全局变量更方便,这样就不必将变量作为参数传递,从而简化了函数的签名。
另一种可以是非侵入性的“全局”服务,如日志类(将发生的事情保存在文件中,这通常是可选的,并且可以在程序中配置,因此不会影响应用程序的核心行为),或者std :: coutstd :: cinstd :: cerr,它们也是全局对象。
任何其他东西,即使它的生命周期几乎与程序的生命周期一致,也总是将其作为参数传递。甚至变量在模块中也可以是全局的,只有在模块中没有任何其他人可以访问,但在任何情况下,依赖关系总是作为参数存在。
回答者:Peregring-lk

相关问题