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

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

假设我使用的是Javascript。

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

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

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

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

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

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

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

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

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

public class Credentials { public static string Username {get;set;} } //...somewhere in your code Credentials.Username = "MyUserName"; 

编辑:

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

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

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

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

我会说你应该使用Singleton模式 。

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

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

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

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

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

函数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);