什么时候去静态课?

时间:2011-01-12 10:39:44

标签: c# .net

每当我为某些东西编写解决方案时,我倾向于使用大量静态类或根本不使用任何静态类。例如,在最近的一个项目中,我不得不通过一些箍发送一个带有一些字符串/ bool / datetime数据的类,唯一不静态的是这个数据保持类。其他一切(3个具有不同处理职责的漂亮大班)都是静态的。

我认为我在这里要求的是关于何时(以及为什么)我应该避免对这些“进程X,输出Y”情况使用静态类的一些输入。是否可以随时使用它们,只要它们可以工作,或者我在脚下拍摄有关可伸缩性,插件支持等的内容?

我希望这是一个好问题。我不是要求关于静态类是否“更好”的论据 - 只要输入我应该避免使用它们。

7 个答案:

答案 0 :(得分:4)

我写的大部分代码:

  • 使用依赖注入/ IoC
  • 需要可模仿/可测试

所以我只使用几乎所有东西的对象。

我仍然使用静态像:

  • 扩展方法
  • 常量
  • 帮助/实用方法(预扩展方法)
  • 操作员方法

答案 1 :(得分:2)

这两个问题仍然有点相同。我对静态类的主要关注是继承和可访问性。

当使用静态类(在最坏的情况下为public)时,每个人都可以访问您的进程和函数。大部分时间都不是你想要的。某些对象太容易进入您的功能并进行一些修改。因此,依赖注入很好用。 (在参数中传递要修改的对象,在本例中为process-object)。

为了防止他人操纵你的process-object,为什么不尝试使用某种单例模式(甚至是前单例模式),所以实际上有一个真实的对象可以与之交谈?如果应该修改某些内容,则可以将该对象传递给函数的参数。然后你可以让一位经理持有你的process-object。其他人不应该去找对象。

静态类也难以继承。覆盖静态方法似乎有点奇怪。因此,如果您确定该过程不是唯一的过程,并且您将创建一些更具体的过程,那么也应该避免使用静态类。

答案 2 :(得分:1)

静态类通常用于小型数据容器和常规方法。除非必要,否则不应包含大数据。这些类是不可扩展的。

答案 3 :(得分:1)

如果只有一种方法,我建议您将方法设为静态。在这种情况下,创建一个类的实例几乎没有意义

如果您希望某个字段的行为与global variable类似,则可以使用静态属性。这是一个匹配Singleton pattern

的设计模式

我使用静态属性来跟踪整个应用程序需要使用的状态。

休息时,与我的工作对象相关的所有事情都是要走的路(显然有一些例外)

答案 4 :(得分:1)

广泛使用静态就像将应用程序置于具体内容中一样。应该避免使用它们,除非非常特殊的情况,例如非常普遍的实用程序/帮助程序方法。一个很好的清单发布在djeeg的前一个答案中。

答案 5 :(得分:1)

我在使用静态类时遇到的主要问题是依赖关系是硬连线的。如果A类需要使用B类中的特性,它必须明确地知道它,这会导致紧耦合。

虽然这并不总是一个问题,但随着代码的增长,您可能会发现更改程序行为以适应新要求更加困难。例如,如果您想使程序的行为可配置,那将很困难,因为这将需要在代码中显式if / switch。否则,您可以简单地使类依赖于接口和交换实现。

简而言之,您正在阻止自己使用已知良好解决方案的众所周知的设计模式来解决您可能遇到的问题。

答案 6 :(得分:1)

我通常会尽量避免在类中使用静态方法。如果我需要全局访问一些数据,我至少会将一个类包装成一个单例。对于较大的项目,我建议使用Inversion of Control容器以Singleton方式实例化和注入“全局”实例。