如何在没有全局变量的情况下保留数据?

时间:2009-05-21 22:32:32

标签: c# global-variables

我习惯使用脚本语言。 PHP,Javascript等,我写了一些相对简单的Java和C#应用程序。这是一个我一再需要答案的问题,我想我不是唯一一个。

假设我使用的是Javascript。

我有一个由GUI调用的函数A(),它检索一些值。

函数B(),也由GUI调用,需要该值,但函数B()将被调用任意次数,在A()之后的任意长度。

我不希望A()每次都重新计算该值。

一个示例是登录凭据。 A()要求输入用户名,B()每次调用时都会使用该值附加到日志中。

为此,我可能只使用全局变量。

现在,C#。没有全局变量!我该怎么做?

修改 享受答案,但有很多“尽量不使用全局”的评论。我明白了,但我想听听这个要求的替代模式。

5 个答案:

答案 0 :(得分:5)

这不是一个好习惯,但如果你真的需要它,有很多方法:

  1. Web应用程序:您可以将变量放在某种上下文中,例如会话或应用程序范围。
  2. 桌面应用程序:您可以创建对象并将其存储为始终使对象处于活动状态的类的属性。
  3. 任何类型的应用:使用公共静态属性。每个人都可以看到它。

答案 1 :(得分:4)

首先,总是问问自己,你是否真的需要一个全球性的,通常你不会。但如果你真的需要一个......

执行此操作的最佳方法是在一些明智的命名类上使用静态属性,它实际上会成为您的全局变量

public class Credentials
{
  public static string Username {get;set;}
}

//...somewhere in your code

Credentials.Username = "MyUserName";

编辑:

这里的几个人已经说过全局变量不好的一揽子声明,我同意这种观点,看来C#的设计师也同意,因为它们根本不可用。

然而,我们应该看看为什么Globals是坏的,并且他们大多被认为是坏的,因为你打破了封装的规则。静态数据虽然并不是很糟糕,静态数据的好处在于你可以封装它,我上面的例子是一个非常简单的例子,可能在现实世界的场景中你将静态数据包含在同一个类中其他工作与凭证,可能是登录类或用户类或任何有意义的应用程序。

答案 2 :(得分:1)

我说你应该使用Singleton Pattern

如果您要使用多线程应用程序,那么您还需要确保访问单例实例的属性是线程安全的。

一如既往,请仔细考虑在您的应用程序中引入任何类型的全局,但不要害怕使用它。很多事情确实是全局性的,例如App.Settings,其中没有任何“坏”。

这个article on MSDN解释了如何在c#中正确创建单例。

答案 3 :(得分:0)

在C#中,获取类似于全局变量的行为的方法之一是使用静态类方法和类变量。静态类方法和变量在C#中有一个实例,有点类似于其他语言中的全局变量。

那就是说,对于你的问题,这听起来更像是一个设计问题。 C#非常注重面向对象设计;我怀疑你给出的问题是更好的OOD可以解决你的问题。

答案 4 :(得分:0)

函数A将成为类的一部分(称为C)。然后,函数A可以存储登录凭据并提供一个函数(或在C#中,一个属性)来获取凭据。当需要它们时,您只需使用该属性获取存储的凭据并将它们传递给函数B(在不同的类上)。

class C
{
    public void functionA()
    {
         credentials = obtainCredentials;
    }

    private LogonCredentials _logonCredentials = null;

    public LogonCredentials logonCredentials
    {
        get { return _logonCredentials; }
    }
}

class D
{
    public void functionB(LogonCredentials credentials)
    {
       //do stuff
    }
}

///other stuff
///other function ...
    ...
    instanceC = C();
    instanceC.functionA();
    ///more stuff here
    instangeD = D();
    instanceD.functionB(instanceC.logonCredentials);