以下是MSDN在“何时使用静态类”一节中所说的:

static class CompanyInfo { public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddress"; } //... } Use a static class as a unit of organization for methods not associated with particular objects. Also, a static class can make your implementation simpler and faster because you do not have to create an object in order to call its methods. It is useful to organize the methods inside the class in a meaningful way, such as the methods of the Math class in the System namespace.

对我来说,这个例子似乎没有涵盖静态类的很多可能的使用场景。在过去,我曾将静态类用于相关函数的无状态套件,但仅此而已。那么,在什么情况下应该(和不应该)将类声明为静态的呢?


当前回答

我确实倾向于为工厂使用静态类。例如,这是我的一个项目中的日志类:

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是使用静态访问器调用的。对我来说,大多数时候,如果你可以调用一个类的静态方法,这就是你能做的一切,所以我把类标记为静态,以额外的清晰。

其他回答

我只对辅助方法使用静态类,但随着c# 3.0的出现,我更愿意为这些方法使用扩展方法。

我很少使用静态类方法,原因与我很少使用单例“设计模式”相同。

对于c# 3.0,扩展方法可能只存在于顶级静态类中。

基于MSDN:

不能为静态类创建实例 如果类声明为静态,则该类的成员变量应该是静态的 密封[不可继承] 不能包含实例构造函数 内存管理

示例:数学计算(数学值)不会改变[定义值的标准计算]

当我希望使用函数而不是类作为重用单元时,我已经开始使用静态类。以前,我对静态类非常反感。然而,学习f#让我从新的角度看待它们。

这是什么意思呢?好吧,比如说在编写一些超级DRY代码时,我最终得到了一堆只有一个方法的类。我可能只是将这些方法拉到一个静态类中,然后使用委托将它们注入到依赖项中。这也可以很好地使用我选择的依赖注入容器Autofac。

当然,直接依赖静态方法通常仍然是有害的(有一些无害的用途)。

如果你使用代码分析工具(例如FxCop),如果一个方法不访问实例数据,它会建议你将该方法标记为静态。其基本原理是有性能增益。CA1822 -将成员标记为静态。

这更像是一个指导方针,而不是规则,真的……