CSharp - c#何时使用静态类?

  显示原文与译文双语对照的内容

这个问题已经有了如下答案:

下面是 MSDN 有要说什么下什么时候使用静态类:


static class CompanyInfo
{
 public static string GetCompanyName() { return"CompanyName"; }
 public static string GetCompanyAddress() { return"CompanyAddress"; }
//...
}

使用静态类作为不与特定对象关联的方法的组织单元。 另外,静态类可以使实现更加简单和快速,因为你不必创建一个对象来调用它的方法。 以一种有意义的方式组织类内部的方法(例如System命名空间中的Math类的方法)是很有用的。

于静态classes,相关对于我来说,这个例子好像不能盖很多种可能的使用 scenarios. 在过去我已经使用静态类的相关功能用于无状态的套件,但是没有太大的。 因此,在什么情况下,一个类被声明为静态的?

时间:

我在以前的线程中编写了静态类的思想:
http://stackoverflow.com/questions/205689/class-with-single-method-best-approach#206481

我曾经喜欢用静态方法填充的工具类。 他们对 helper 方法进行了大量的整合,否则会导致冗余和维护地狱。 它们很容易使用,没有实例化,没有处理,只需触发'n'。 我想这是我第一个实验中未意识到自己尝试创建一个面向服务的体系架构- 有很多无状态的服务,只需以前是怎么做他们的工作以外什么都没有 但是随着一个系统的成长,龙即将到来。

多态

假设我们的方法 UtilityClass.SomeMethod 能很好地沿着。 突然我们需要稍微改变功能。 大多数功能是相同的,但是我们必须改变几个部分。 ,如果不是被一个静态方法,我们可以做一个导数类,并根据需要更改该方法内容。 因为这是一个静态方法,我们不能。 当然,如果我们只需要添加功能之前或者之后老的方法,我们可以创建一个新的类,并调用旧的放于其中- - 但这仅仅是一个总量。

界面灾难

静态方法不能通过接口来定义,因为逻辑原因。 而且,由于我们无法重写静态方法,静态类都是无用的,当我们需要通过它们的接口传下去。 这使我们无法将静态类作为策略模式的一部分使用。 我们可以通过传递代理而不是接口来修补一些问题。

磅测试

这基本上与上面提到的界面灾难相伴。 由于我们交换实现的能力有限,所以我们也有问题用测试代码替换生产代码。 跟之前一样,我们可以总结起来,但是它将要求我们将大的部分我们的代码,使之能够接受包装器( wrapper ),而不是实际的对象。

Fosters

以静态方法通常被用来作为工具方法和工具方法通常会有不同的目的,我们很快会是做成大类了充满了non-coherent功能- 理想情况下,系统内的每一个类都应该有一个单一的作用。 我更愿意让一个五次,只要它们的目的是定义完善的类。

参数蠕变

首先,可爱的和无害的静态方法可能需要一个参数。 随着功能的增长,添加了几个新的参数。 我们会添加一些可选的参数,所以我们创建方法( 或者只在支持它们的语言中添加默认值)的重载。 不久,我们有一个方法来获取 10个参数。 只有前三个才真正需要,参数 4 -7是可选的。 但是如果参数 6被指定,则需要 7 -9填充。。 在同一time,有我们创建了一个类其中了单人的做这里静态方法做了什么,我们可以解决这个通过采用在在构造函数中所需的参数,并允许上用户可以设置可选的值通过属性或者方法的引用来设置多个相互依赖的值 在自己的类也 anyways,,如果一个方法以开始对这个数量的复杂性,它最可能需要 be.

于没有理由相关, 苛刻的消费者来创建类的一个实例

最常见的参数之一是,为什么需求,消费者是我们班的创建一个实例用于调用这个单独的方法,在无法用使用该实例的事后? 在大多数语言中创建一个类的实例是非常廉价的操作,所以速度不是问题。 从future,增设额外的一行代码,以调用程序是一个低成本的用于铺设的基础,一个更加可以维护的解决办法, 最后,如果你想避免创建你的类的实例,只要创建一个单例包装器,它允许以方便重复使用- 尽管这确实会使这种需求,你的类是无状态的。 如果它不是无状态的,你仍然可以创建静态包装方法来处理一切,同时仍然给你所有的好处。 最后,你也可以创建一个隐藏实例化的类,就像它是一个单独的类: MyWrapper.Instance 是一个只返回 new MyClass();的属性

在 absolutes, 仅一个Sith程序处理

当然,我对静态方法的不喜欢也有例外。 于静态方法调用相关 System.Convert 作为example,真正的实用程序类,并且不造成任何风险导致实体的过度膨胀是绝好 cases. 如果你的项目是一个一次性的。在不需要为将来的维护,总体架构- 静态或者非静态的,并不真正的问题- 开发速度真的不是很重要的啊,但是

标准,标准,标准

使用实例方法并不妨碍你同时使用静态方法,反之亦然。 只要微分背后有推理,它是标准化的。 没有什么比通过不同的实现方法扩展一个业务层更糟糕的了。

我经常在工厂使用静态类。 例如这是我的一个项目中的日志类别:


public static class Log
{
 private static readonly ILoggerFactory _loggerFactory =
 IoC.Resolve<ILoggerFactory>();

 public static ILogger For<T>(T instance)
 {
 return For(typeof(T));
 }

 public static ILogger For(Type type)
 {
 return _loggerFactory.GetLoggerFor(type);
 }
}

你可能已经注意到,IoC是用静态访问器调用的。 的大部分时间对我来说,如果你能把一个类,那就是你唯一能做的,所以我将类标记为静态上的静态方法作为额外的清晰度。

...