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

时间:2012-03-17 03:57:18

标签: c# oop static instance

  

可能重复:
  When to Use Static Classes in C#

有人可以提供有关何时创建的指南,标准检查点 static class以及何时创建实例类。

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

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

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

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

3 个答案:

答案 0 :(得分:20)

在我看来,最好的区别是州。

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

如果您的课程将被给予输入然后存储它或以其他方式预期将保持其当前状态,那么您将有一个常规课程。

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

简而言之:

  • 如果是一包方法没有状态
  • 它不是抽象的,继承或实现接口

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

我希望有所帮助。

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

答案 1 :(得分:1)

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

class Point{
    float x;
    float y;

    Point(float x, float y);

    Point halfway(Point other);

    Line lineThrough(Point other);

    float distanceFrom(Point other);

    ...
}

这有点多余,但它允许您在将来编写更易读的代码 - 更好地保留所有数据封装和精心设计,使您成为更好的程序员,因为通过两点的线的等式来自

float slope = (xone-xtwo)/(yone-ytwo);
float yintercept = yone-slope*xone;

Point p1 = new Point(xone, yone);
Point p2 = new Point(xtwo, ytwo);
Line linethrough = p1.lineThrough(p2);

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

答案 2 :(得分:1)

如果它应该是函数的集合,那么你将使用静态类。喜欢:

int result = calculation.add(int p1,int p2);
float result = calculation.divide(int p1,int p2);

你不能在静态类上说这个:

Calculation mycalculator = new Calculation();

因为它们无法实例化。它们只能包含静态成员。

取自here

但是如果它是代码的成员,比如树中的apple,那么你将使用实例类。每个苹果都有自己的特色,但它不会改变它是苹果的事实。它是树的一部分,包含苹果的多个实例。

Apple apple1 = new Apple();
apple1.color = green;
apple1.age = newborn;
apple1.fallfromtree(speed);

Apple apple2 = new Apple();
apple2.color = red;

您可以查看here