何时在C#中使用静态类

时间:2008-10-27 20:53:38

标签: c# class static

以下是MSDN has to say under When to Use Static Classes

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

使用静态类作为单位   组织方法没有   与特定对象相关联。   另外,静态类可以使你的   实现更简单,更快捷   因为你不必创建一个   对象以调用其方法。   组织方法很有用   在课堂内以有意义的方式,   比如Math类的方法   在系统命名空间中。

对我而言,该示例似乎并未涵盖静态类的许多可能使用场景。在过去,我已经将静态类用于相关函数的无状态套件,但这就是它。那么,在什么情况下应该(而且不应该)将一个类声明为静态?

11 个答案:

答案 0 :(得分:694)

答案 1 :(得分:141)

在决定是将类设为静态还是非静态时,您需要查看要尝试表示的信息。这需要更加“自下而上”的编程风格,您可以专注于首先代表的数据。您正在写的课程是真实世界的对象,如摇滚乐还是椅子?这些东西是物理的,并且具有物理属性,例如颜色,重量,它告诉您可能想要实例化具有不同属性的多个对象。我可能同时想要一把黑色椅子和一把红色椅子。如果您同时需要两个配置,那么您立即知道您将要将其实例化为一个对象,因此每个对象可以是唯一的并且同时存在。

另一方面,静态函数倾向于向不属于真实世界对象的动作或可以轻易表示的对象提供更多动作。请记住,C#的前身是C ++和C,您可以在其中定义类中不存在的全局函数。这为“自上而下”编程提供了更多帮助。静态方法可用于这些情况,即“对象”执行任务没有意义。通过强制您使用类,这样可以更轻松地对相关功能进行分组,从而帮助您创建更易于维护的代码。

大多数类可以用静态或非静态来表示,但是当你有疑问时,只需回到你的OOP根源并尝试考虑你所代表的内容。这是一个执行动作的对象(可以加速,减速,转弯的汽车)还是更抽象的东西(比如显示输出)。

与您的内在OOP保持联系,您永远不会出错!

答案 2 :(得分:35)

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

答案 3 :(得分:22)

如果您使用代码分析工具(例如FxCop),则建议您标记方法static,如果该方法不访问实例数据。理由是有一个性能提升。 MSDN: CA1822 - Mark members as static

这更像是指导而非规则,真的......

答案 4 :(得分:12)

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

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。 大多数的时间对我来说,如果你可以在一个类上调用静态方法,那就是你所能做到的所以我将这个类标记为静态以便更加清晰。

答案 5 :(得分:10)

当我希望使用函数而不是类作为我的重用单元时,我开始使用静态类。以前,我只是关于静态类的邪恶。然而,学习F#让我以新的眼光看待它们。

这是什么意思?好吧,比如在编写一些超级DRY代码时,我最终得到了一堆单方法类。我可能只是将这些方法拉入静态类,然后使用委托将它们注入依赖项。这也适用于我选择Autofac的dependency injection(DI)容器。

当然,直接依赖静态方法仍然通常邪恶(有一些非邪恶的用途)。

答案 6 :(得分:10)

静态类非常有用并且有一个位置,例如库。

我能提供的最好的例子是.Net Math类,一个包含数学函数库的System命名空间静态类。

就像其他任何东西一样,使用正确的工具来完成工作,如果没有,任何东西都可以被滥用。

茫然地将静态类视为错误,不要使用它们,或者说“只能有一个”或者没有,就像使用它们一样错误。

C#.Net包含许多静态类,它们与Math类一样使用。

因此,如果正确实施,它们将非常有用。

我们有一个静态的TimeZone类,它包含许多与业务相关的时区函数,不需要创建类的多个实例,就像Math类一样,它包含一组全局可访问的TimeZone相关函数(方法)in静态类。

答案 7 :(得分:9)

我使用静态类作为定义给定类型的对象可以在特定上下文下使用的“额外功能”的手段。通常它们会变成实用类。

除此之外,我认为“将静态类用作与特定对象无关的方法的组织单位。”很好地描述了他们的用途。

答案 8 :(得分:7)

自OOP开始以来,这是另一个古老而又非常热门的问题。 当然,使用(或不使用)静态类的原因有很多,其中大多数已被大量答案所覆盖。

我只想加上我的2美分,说,我把一个类静态化,当这个类在系统中是独一无二的时候,在程序中有任何实例是没有意义的。但是,我保留这个用于大班的用法。我从未在MSDN示例中声明像&#34; static&#34;这样的小类。而且,当然不是将成为其他类成员的类。

我还要注意静态方法和静态是需要考虑的两个不同的事情。接受的答案中提到的主要缺点是静态方法。 static classes 提供与普通类(涉及属性和参数)相同的灵活性,并且它们中使用的所有方法都应该与类的存在目的相关。

在我看来,一个静态类的候选者的一个很好的例子是&#34; FileProcessing&#34; class,包含与程序的各种对象相关的所有方法和属性,以执行复杂的FileProcessing操作。拥有这个类的多个实例几乎没有任何意义,并且静态将使它可以随时用于程序中的所有内容。

答案 9 :(得分:2)

我只使用静态类作为辅助方法,但随着C#3.0的出现,我宁愿使用扩展方法。

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

答案 10 :(得分:1)

基于MSDN

  1. 您无法为静态类创建实例
  2. 如果类声明为static,则成员变量对于该类
  3. 应该是静态的
  4. 密封[不能继承]
  5. 不能包含实例构造函数
  6. 内存管理
  7. 示例:数学计算(数学值)不会改变[定义值的标准计算]