在C#中使用全局变量的最佳实践

15

有人曾经说过:

"全局变量"实际上是你创建的一个变量,仅仅是为了"保存一些信息",因为你的对象模型很弱,而且你没有找到变量存在的"真正目的"。全局变量几乎总是大型架构畸形的标志。

这可能是真的。但我不知道任何没有使用全局变量的好的大型程序的好例子,肯定不会像上面建议的那样少用。作用域才是关键。你可以说在只有一个类的程序中它的参数不是全局变量。但它们是。

无论如何...

我仍然在掌握singleton的概念,据我所知,在C#中它们 actually 没有任何意义。我还有一种感觉,当无法避免使用全局状态时,我们仍应避免简单地使用一个充满static properties的公共类:

那么,如果不是单例模式或公共类,我们应该怎样在C#中使用全局变量?

并且在什么情况下我们应该使用它们?假设它们很可能无法避免。永远。

为什么我们应该避免使用static classstatic?如果在C#中确实是这种情况的话。

简单来说:在C#中使用全局变量的最佳实践是什么?


2
从技术上讲,在C#中并不存在所谓的全局变量,它们当然可以是类级别的全局变量,并且被声明为public,实现了相同的功能,但范围有所缩小。 - Ed S.
3
虽然这篇文章写得很好,并且语法正确,但我认为这个问题不适用于这个网站? - gbianchi
1
@gbianchi:我同意你的观点,但如果可以的话,我会给它加上100分。我迫不及待地想看看堆栈精英们对此有何看法。 - Daniel Szabo
@gbianchi,你能给我推荐一个我可以申请的 SEN 网站吗? - cregox
伙计们,(来自Robaticus到ErikPhilips)我希望我的最后一次编辑足以表明这是一个“真正的问题”。 - cregox
显示剩余11条评论
1个回答

6

一切都取决于上下文

如果您可以确定计算所需的环境变量,那么您可以将该计算包装在一个更大的上下文中,其中那些类似全局的变量具有较窄的作用域(它们现在是上下文的局部变量)。

这更好,因为现在您可以拥有多个实例化的上下文,它们应该独立工作且不会相互干扰。这也称为可重入上下文。


那么你的意思是C#中根本不存在整个全局变量的概念,如果有类似单例的东西复制它的行为,它应该永远不会被使用?如果是这样的话,你能提供一个例子来保存一个常量的配置值,这个值将在整个应用程序中保持不变吗?假设我想在一个地方为应用程序版本和公司网站设置配置,并且第三种类型的全局变量不是常量,而是当前应用程序语言。 - cregox
是的,它们存在,并且由您控制或限制其范围。应用程序版本和公司网站似乎是应该仅限于程序集(使用程序集属性)的元数据;应用程序语言可以依赖于当前登录的用户,因此可能涉及请求或会话范围。你明白了... - Jordão
好的,对我来说,这些都不像全局变量 - 但它们似乎都像一个。我想我已经掌握了它的要领... - cregox
每当你遇到这种情况时,都要考虑一下如果同时有多个作用域实例会发生什么。例如,多个用户会话不应该共享相同的语言设置。 - Jordão
传统的“全局变量方案”中,作用域的多个实例不会相互影响,除非是同一程序运行所有实例 - 因为传统上每个实例都是复制的二进制运行。但这一切都是另一个话题了。既然你再次提到语言问题,我只想提一下,当我的计算机上的程序根据操作系统请求或会话设置语言时,我很讨厌它。应该是我选择的设置。在巴西,这里有很多机器,操作系统是葡萄牙语,但我喜欢运行的软件始终是英文的。 - cregox

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