全局变量 v C# 中的设置

Posted

技术标签:

【中文标题】全局变量 v C# 中的设置【英文标题】:Global variables v Settings in C# 【发布时间】:2010-12-11 09:00:29 【问题描述】:

我在不同的地方读到过,具有全局范围的变量,即具有静态成员的公共静态类,被认为违背了 OO 的哲学,并且不是好的设计。 (例如,我看到 cmets 大致是这样的:“如果您使用的是全局变量,则说明您的做法不对。”或者类似的词。)

但是,如果您使用 Visual Studio 提供的设置机制,例如“Settings.Default.MySetting”等,这在整个应用程序中全局可用,那么这与使用公共静态类有何不同?

另外,使用单例对象也可以达到同样的效果,但这也引发了各种不同的意见,至少可以这么说。

全局变量非常有用,(VB 模块,有人吗?),但我正在尝试自学如何正确地执行此面向对象的问题,因此,如果从面向对象的角度来看全局变量闻起来很糟糕,那是什么?替代方案?

我对人们对使用“设置”功能的看法特别感兴趣。这算不算好的面向对象设计?

感谢任何cmets。

【问题讨论】:

【参考方案1】:

静态方法和其他成员本身并不是坏习惯。只是不太熟悉 OO 概念的人倾向于在代码中到处乱扔静态方法、属性和字段,而没有意识到后果是什么。

一般来说,对于配置设置、帮助程序和实用程序类、抽象工厂、单例等,使用静态成员是完全可以接受的。

【讨论】:

【参考方案2】:

公共静态类或成员并不总是一个坏主意(即使它不是完美的 OO)。许多优秀的 OO 设计使用公共静态成员来表示记录器或设置(如您所指出的)。 Static Gateway 是如何以 OO 方式执行此操作的一个很好的示例。

【讨论】:

【参考方案3】:

全局变量,如 goto,是所有初学者都应该避免的东西,但对高级程序员来说却非常有用。

我会说,如果您没有信心并且没有具体的、合理的理由说明它是一个很好的应用程序,请不要使用它们。在求助于全局变量之前掌握 OO。

【讨论】:

【参考方案4】:

设置机制...嗯...

我主要将这些视为环境的一部分。像操作系统或时间,但对于应用程序。它们并不是真正的“变量”,就像您在 INIT 期间声明的那样。

但是,您可以在它们周围包装一个对象,并仅通过该对象访问它们,而不是在运行时需要时读取它们。我还没有测试过,但它可能是一个性能清洗(或者如果你没有做好内存管理,那么对原始读取它们是不利的)。

最终,随着应用程序的成熟,这样的事情最终还是让对象包裹在它们周围。我的规则是,每当我开始思考,“不,这太简单了,太原子了,不需要对象......”这就是我让它成为对象的线索。

【讨论】:

【参考方案5】:

在 C# 中,您将很难反对良好的 OO 设计,因为您无法摆脱 OO。它不像 C++,您可以在其中混合和匹配结构化与 OO 编程——这些类型的参数经常出现的领域。 类的静态成员是面向对象的。 Microsoft 生成的设置也是如此,因为代码生成为它们创建了 OO 封装,或者至少在它们周围创建了一个“对象容器”。所以它们永远不是全局变量,因为 C# 中不存在全局变量——它们只是类上的静态成员——没有什么是非 OO 的。

如果论点是关于单例与静态成员的,那么它就是将一个 OO 论点与另一个 OO 论点相提并论。

然后总是存在哲学观点与实践观点。在大多数领域中,除了学术研究之外,所实施的理想哲学观点本身并不值得。现实世界需要真正的解决方案,混合解决方案。

【讨论】:

很难吗?是的。艰难时期会阻止一个坚定、无能的开发者吗?绝不。我已经记不清有多少次我看到某些东西以比设计的方式更困难和更不正确的方式实现。 (如果我说我从来没有犯过这样的事情,那我就是在撒谎。) 好点 Greg D。你应该看看我过去的一些代码混乱!

以上是关于全局变量 v C# 中的设置的主要内容,如果未能解决你的问题,请参考以下文章

在C#中静态变量是否全局变量

C#中在哪里声明全局变量啊,具体位置在哪儿,我是初学者。。。

android studio全局变量加m.怎么设置

从 C# 访问 C 全局变量 'errno'

如何从 C# 中的 C++ dll 中的全局变量从函数中获取返回数组?

let 内的 Clojure 循环(全局 v 局部变量)