何时在实例类上使用Static类的指南?

Dha*_*jay 7 c# oop static instance

可能重复:
何时在C#中使用静态类

有人可以提供指南,关于何时创建静态类的标准检查点以及何时创建实例类.

基本上我在编写代码时看到的很多次,使用静态类和方法可以完成同样的事情,并且我对许多事情感到困惑.

到目前为止,我知道以下检查点:

  1. 如果考虑对象只能在整个应用程序中存在一次,那么它将处于"静态"状态

  2. 如果方法不在其中使用任何字段变量,那么它可以是静态方法.

小智 20

在我看来,最好的区别是国家.

如果你的类没有状态,并且只是一系列相关的方法,当给定输入时,会给你一个输出,那么你有一个很好的静态类候选者.

如果您的类将被给予输入然后存储它或以其他方式将被期望保持其当前状态然后您有一个常规类.

此外,如果您的类将被声明abstract或将继承其他类的行为或从接口实现行为,那么您将离开静态类并拥有正常的类.

简而言之:

  • 如果它是一袋方法没有状态
  • 并且它不是抽象,继承或实现一个接口

那么你很有可能它是一个静态类:)

我希望有所帮助.

NB(根据下面的精明评论)state指的是存储一些代表对象当前事务状态的数据的类.也许是类级变量或属性.


Fra*_*Man 1

静态类最适合用于创建将被调用的函数库。常规类用于创建可操作的对象。它允许您封装一堆代码的关系。以欧几里得空间中的一个点为例。您可以声明两个浮点数并单独跟踪它们,或者您可以使用以下合同来声明点的工作方式。

class Point{
    float x;
    float y;

    Point(float x, float y);

    Point halfway(Point other);

    Line lineThrough(Point other);

    float distanceFrom(Point other);

    ...
}
Run Code Online (Sandbox Code Playgroud)

这有点多余,但它允许您将来编写更具可读性的代码 - 更好地封装所有数据并精心设计,使您成为更好的程序员,因为通过两点的直线方程来自

float slope = (xone-xtwo)/(yone-ytwo);
float yintercept = yone-slope*xone;
Run Code Online (Sandbox Code Playgroud)

Point p1 = new Point(xone, yone);
Point p2 = new Point(xtwo, ytwo);
Line linethrough = p1.lineThrough(p2);
Run Code Online (Sandbox Code Playgroud)

抱歉,伪代码有点 Java 知识。我的脑子里有Java。