8

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

假设我在 Javascript 中。

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

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

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

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

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

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

编辑: 享受答案,但有很多“尽量不要使用全局变量”的评论。我确实理解,但我想听听此要求的替代模式。

4

5 回答 5

5

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

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

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

最好的方法是在一些合理命名的类上拥有一个静态属性,它实际上成为你的全局变量

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

//...somewhere in your code

Credentials.Username = "MyUserName";

编辑:

这里有几个人说全局变量不好的笼统声明,我同意这种观点,而且 C# 的设计者似乎也同意,因为它们根本不可用。

然而,我们应该看看 Globals 不好的原因,它们大多被认为是坏的,因为你违反了封装规则。静态数据虽然不一定是坏事,但静态数据的好处是您可以封装它,我上面的示例是一个非常简单的示例,可能在现实世界的场景中,您会将静态数据包含在同一个类中是否可以使用凭据进行其他工作,可能是 Login 类或 User 类或对您的应用有意义的任何东西。

于 2009-05-21T22:40:37.070 回答
1

我会说您可能应该使用Singleton Pattern

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

与往常一样,请仔细考虑在您的应用程序中引入任何类型的全局变量,但不要害怕使用它。很多东西确实是全局的,例如 App.Settings 中没有任何“坏”的东西。

MSDN 上的这篇文章解释了如何在 c# 中正确创建单例。

于 2009-05-21T22:45:08.997 回答
0

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

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

于 2009-05-21T22:40:40.753 回答
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);
于 2009-05-21T22:42:53.963 回答