这个问题已经有一个答案在这里:

这里是什么 MSDN说下 当使用静态的课程:

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

使用静态的类作为一个单元的 组织的方法不 相关的特别对象。此外,一个静态的类可以让你 执行更为简单和更快的 因为你不需要创建一个 目,以便呼吁它的方法。它是有用的组织方法 在类有意义的方式, 例如方法的数学课上 在该系统名称空间。

对我来说,例似乎并不复盖很多种可能的使用方案,为静态的课程。在过去我已经使用静类为无国籍套房有关的功能,但是关于它。所以,在什么情况下应当(和不应该的)一类被宣布静?

有帮助吗?

解决方案

我写了我的思想静类在先前的一个堆栈溢出回答:类的单一方法--的最佳方法?

我曾经爱过实用的课程充满了静态的方法。他们做了一个很大的合并的辅助方法,否则将谎言的周围造成冗余和维护地狱。他们非常容易使用,没有实例,没有处置,只火'n'forget.我猜这是我第一次不知情的尝试建立一个面向服务的架构中大量的无国籍者服务的,只是做他们的工作和没有别的。作为一个系统的增长,但是,龙将到来。

多态性

说我们的方法UtilityClass.SomeMethod高兴地热闹非凡。突然我们需要改变的功能。大部分功能是相同的,但是我们必须改变几个部分仍然。不是一个静态的方法,我们可以做一个衍生物类和改变方法的内容作必要的。作为这是一个静态的方法,我们不能。当然,如果我们只需要添加功能之前或之后的老方法,我们可以创建一个新的类,并呼旧它里面的-但那只是总值。

接口的困境

静态的方法不能被定义通过接口逻辑的理由。而且,由于我们不能复盖静态的方法,静类是无用的,当我们需要通过他们通过他们的接口。这使得我们无法使用的是静态的课程,作为战略的一部分模式。我们可以修补的一些问题上通过 传递的代表,而不是接口.

测试

这基本上与该接口的困境。作为我们能互换的实现方式是非常有限,我们也有麻烦替代生产与测试的代码。再次,我们可以用他们了,但它将要求我们改变的大部分地区,我们的代码只是为了能够接受的包装,而不是实际对象。

促进blob

为静态的方法通常用来作为实用的方法和实用方法通常会有不同的目的,我们很快就会结束了一个大类充满了不一致的功能理想的是,每类都应有一个目的在系统内。我宁愿有五个次类别,只要他们的目的都是很好的定义。

参蠕

首先,小可爱无辜的静态的方法可能会采取单一的参数。作为功能性的增长,几个新的参数的增加。不久还参加,是可选择的,因此,我们创建的重载的方法(或者只是添加的默认值、语言支持他们)。不久之前,我们有一个方法,需要10个参数。只有第三个是真的需要、参数的4-7是可选择的。但是,如果参数6的规定,7至9需要被填满,以及...我们创造了一种类的单一目的在做什么,这种静态的方法这样做,我们可以解决这个通过采取所需的参数的构造,以及允许用户设定可选择的价值观通过性质或方法的设定多个相互依赖的价值观,在同一时间。此外,如果一方法已发展到这一数额的复杂性,最可能需要在自己的类。

要求消费者创造一个实例类为没有理由

最常见的一个论点是:为什么需求的消费者们创建的一个实例援用这个方法,而没有使用的实例之后?创建一个实例,一类是一个非常非常便宜的运作在大多数语言,这样的速度不是一个问题。增加一个额外的代码行的消费者是一个低成本的基础的一个更易于维护的解决方案的未来。最后,如果你想要避免创造情况下,只要创建一个单独包装的类便于再利用,尽管这不会使要求这类无国籍状态。如果不是无国籍,仍可以建立的静态的包装方法,处理一切,同时仍给你所有的利益在长期运行。终于,你也可以做一个类隐藏的实例,如果它是一个单一实例:MyWrapper.实例是财产,只是返回 new MyClass();

只有西斯的交易在绝对的

当然,也有例外我不喜欢的静态的方法。真正的实用课程,不会造成任何风险膨胀都是优秀的情况下为静态的方法系统。转换为一个例子。如果项目是一个没有要求为未来维持,整体构架真的不是很重要的静态的或者非静态的,并不真正的问题-发展速度,但是。

标准、标准、标准!

使用实例的方法不抑制你从也使用静态的方法,反之亦然。只要有理由的差异和它的标准化。没有什么比看一个业务层庞大与不同执行方法。

其他提示

在决定是否让一个类的静态或非静态的,你需要看看什么样的信息你都试图表示。这就需要更多的''风格的编程在哪里你专注于你的数据是占第一位。是的你正在写一个真正的世界的对象像一个摇滚,或者椅子?这些东西是物理和物理属性,例如颜色、体重告诉你,你可能想要实例的多个对象有不同的性质。我可能要一个黑色的椅子和一个红色椅子上的同一时间。如果你需要两种配置同时然后您立即知道你会想要的实例,它为对象,这样每个对象可以是独特的,并存在同样的时间。

在另一端,静态功能倾向于借更多的行动不属于一个真正的世界的目或一个目的,你可以很容易地代表。记得,C#'s前身C++和C,你可以,只是定义的全球职能不存在一类。这带来更多的'顶下来'节目。静态的方法可用于这些情况下没有意义,一个"对象"执行任务。通过迫使你使用类,这只会使其更易于集团相关的功能,这有助于创建更易于维护的代码。

大多数课程可以由是静态的或非静态的,但是当你是在怀疑只是回到你的面向对象的根源和尽量想想你是代表。这是一个对象执行行动(一辆车就可以加速,减速,转变)或更多的东西摘要(如显示出)。

与你内心的面向对象,你可以永远不走错了!

C#3.0中,扩展的方法可能只存在顶层静态的课程。

如果您使用的代码分析工具(例如 FxCop),它将建议你标记的方法 static 如果这种方法不要访问的实例的数据。理由是,有一个的性能增益。 MSDN:CA1822标成员作为静态.

它更多的是一个指导原则,比规则,真的...

我倾向于使用静态的课程,用于工厂。例如,这是日志类在我的一个项目:

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);
   }
}

你可能已经注意到,国际奥委会正呼吁一个静态存取器。 大多数 时间对我来说,如果你可以叫静态的方法上课,这是所有你可以这样做我的标记类作为静态的额外的澄清。

静态的类是非常有用和具有的地方,例如图书馆。

最好的例子,我可以提供。净的数学课,名字空间系统的静态级包含一个图书馆的数学功能。

它是其他东西一样,使用正确的工具的工作,如果没有任何事情都有可能被滥用。

面无表情的解雇静类是错误的,不要使用它们,或者说,"只能有一个"或"无",是错误的,因为在使用他们。

C#.Net 包含了一些静态的课程,使用只是喜欢数学课。

所以给出正确的实施,他们是极其有用的。

我们有一个静态的时区类,包含一些相关业务的时区的功能,没有必要建立多个类的实例如此多样的数学课上,它包含一套全球访问时提出过百万的功能(方法),在一个静态的类。

我已经开始使用的是静态的课程时,我希望使用功能,而不是课程,作为我的单元的重复利用。此前,我所有的邪恶的静态的课程。然而,学习 F# 让我看到他们在一个新的光。

我是什么意思?好了,说工作时了一些超级 代码,我结束了一堆一方法的课程。我可能只是把这些方法纳入一个静态的类,然后注射到他们的依赖关系使用一种代表。这也扮演好我的 依赖注射 (二)容器的选择Autofac.

当然,把一个直接依赖于一种静态的方法仍然是 通常 邪恶的(有一些非邪恶的使用).

我使用的是静态的类作为一种手段来定义"功能",这一给定类型的对象可以使用根据特定的上下文。通常它们是实用的课程。

除此之外,我认为,"使用静态的类作为一个单元的组织方法并不与特定的对象。"描述的很好他们的预期使用情况。

这是另一个老但很热的问题,因为面向对象踢。有许多原因而使用(或不)一个静态的类,当然他们中的大多数已在众多的答案。

我只会增加我的2美分到这个,说是,我让一个类的静态的,当此类的东西,将是独特的系统,这会真的让没有感到有任何实例,它的程序。然而,我保留这个使用情况大类。我从来没有宣称这样的小类作为在MSDN例如"静态",当然,不类会成员的其他类。

我还要指出,静 方法 和静 是两个不同的事情要考虑。主要的缺点中提到的接受答案是静态的 方法.静 提供同样的灵活性作为普通类(其性质和参数而言),和所有使用的方法,他们应该是相关的,目的存在的类。

一个很好的例子,在我看来,一名候选人为一个静态的类是"FileProcessing"类,这将包含所有的方法和属性有关的程序的各个对象执行复杂的FileProcessing行动。它几乎没有任何意义有多个此类的实例,是静态的,将使它容易得到的一切都在你的节目。

我只使用静类辅助方法,但随着C#3.0,我宁可使用扩展的方法的那些。

我很少使用的是静态的类方法用于同样的原因,为什么我很少使用单独"的设计模式"。

基于上 MSDN:

  1. 你不能创建的实例静类
  2. 如果该类宣布为静态部件的变量,应该是静态的那类
  3. 封[不能继承]
  4. 不能包含实例的构造
  5. 存管理

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top