.NET中全局变量(或替代方案)的最佳实践

12

如何最佳实践地在 VB.NET WinForms 应用程序中存储全局变量?例如,当用户登录应用程序时,您可能希望存储一个 CurrentUser 对象,该对象可以在整个应用程序中访问。您可以将其存储为模块中的对象或创建一个包含所有所需全局成员的类,但仍需要在某处存储此实例。

框架是否提供了简单的解决方案?

6个回答

16

我认为“不要”有点过分了,这是 Steve McConnell 的一句话:

如果使用得当,全局变量在多种情况下都很有用

就像好的木匠会选择合适的工具,在需要时使用正确的工具一样,程序员也应该利用他们掌握的所有工具。

来自《Code Complete》的“Tour de Force”一书中提供了使用全局数据的几个原因:

  • 保留全局值
  • 简化极其常见数据的使用
  • 消除杂乱数据

McConnell 还说:

只有在万不得已时使用全局数据。在使用全局数据之前,请考虑一些替代方案。

他列出的替代方案如下:

  • 首先将每个变量设为局部变量,并仅在需要时将变量设置为全局变量
  • 区分全局变量和类变量
  • 使用访问例程

我提到的内容在优秀的书籍《Code Complete》中得到了广泛的覆盖。


使用访问例程 <<--- 最重要的 - Burnsys

7

在使用全局变量方面,大约有一条最佳实践。

“不要使用。”

(如果这听起来很严厉,请考虑像 CurrentUser 这样的东西通常应该属于环境已经为您维护了唯一实例的某个东西,例如 Session。查找 API 以获取当前会话,将您的 CurrentUser 存储在那里并从那里检索它。不要创建自己的全局变量,这将使您的应用程序更难以维护,并容易受到竞争条件的影响。)


6
在WinForms应用程序中,我该在哪里找到“Session”? - Colin Mackay

4

您可以将全局可访问的变量存储为适当类的公共只读静态属性,例如创建或填充它的类。


3

这里还有一个讨论此主题的链接:“全局状态和单例模式”http://www.youtube.com/watch?v=-FRm3VPhseI - Esko Luontola

2

我的做法是将像CurrentUserConfigFilePath等全局变量放入program.vb(启动类与sub main)。这样,没有人会毫无意识地使用全局变量,因为它们必须通过program命名空间访问。

在业务逻辑中,我从不直接使用全局变量。如果任何函数需要使用全局变量,则必须将其作为函数参数发送。

无法避免使用全局变量。在我看来,最好用它们的真实名称调用它们并小心使用它们,而不是将它们掩盖在单例、会话或文件中。


0

1
单例可能是“被吹嘘的全局变量”。但这并不意味着它们是处理全局变量的好方法。[请参阅有关单例实例化和线程相关的所有问题。] - Leonidas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接