非静态类相比于静态类有哪些优势?

6

非静态类相对于静态类有什么优势?

静态类不需要实例化,所以我们可以直接使用ClassName.MemberName,那么非静态类有什么用处呢?


2
如果MemberName是静态的,但类不是静态的,您也可以直接使用ClassName.MemberName。当您不需要(也永远不会)创建该类的实例时,请将类设置为静态。这对于扩展类来说是必不可少的。 - Tim Schmelter
1
那么只有一个MemberName吗?使用静态类如何实现“Person”? - Rob Smyth
1
从https://dev59.com/c3RB5IYBdhLWcg3wl4Oc开始。 - V4Vendetta
5个回答

2
一个静态类基本上与非静态类相同,但有一个区别:静态类不能被实例化。换句话说,您不能使用new关键字创建该类类型的变量。因为没有实例变量,所以您可以通过使用类名本身来访问静态类的成员。
静态类只有一个类本身的实例,因此您不能创建多个静态类实例。
查看您的问题,如果类是静态的,则无法将两个不同的值设置为下面属性的值,因为内存中只有一个ClassName实例。
ClassName.MemberName

更多信息请访问

http://msdn.microsoft.com/zh-cn/library/79b3xss3.aspx


2
说你需要存储封装一个员工的信息和操作。
class Employee
{  
    string Name {get; set;}
    double HourlyRate {get; set;}
    double CalculatePay(int hoursWorked) { . . . }
}

现在,假设您的程序需要同时比较两个员工?
没错!使用非静态员工类,您可以实例化两个(或更多)Employee类实例,每个这些对象表示不同的员工。
如果Employee是静态的,则无法做到这一点。
例如:
void CompareEmployees(Employee empA, Employee empB)
{
    if(empA.HourlyRate < empB.HourlyRate)
        Console.WriteLine("Employee {0} has a higher rate than {1}", empA.Name, empB.Name);

    else if(empA.HourlyRate > empB.HourlyRate)
        Console.WriteLine("Employee {0} has a higher rate {1}", empb.Name, empA.Name);
    else
        Console.WriteLine("{0} and {1} have the same rate", empb.Name, empA.Name);
}

1

把一个类比作建筑蓝图,该类的实例(即对象)则是按照蓝图中设计所建造的建筑物。

有了一个蓝图,你可以创建很多建筑物。这些建筑物都具有相同的结构,但是每个都是独立的 - 一个可能门开着,而另一个门关着。

静态类就像一份永远不能用来建造房屋的蓝图。你仍然可以做一些事情,比如将其撕毁或洒咖啡在上面,但是你永远不能打开蓝图上的门,因为它没有实际的门,只有门的设计。

另一种描述这种情况的方式是考虑“状态”。一座建筑(对象)具有一些状态(例如门是否开着),每座建筑的状态可以不同(例如它自己的门是否开着)。一个蓝图(类)也可以有(静态的)状态(例如咖啡是否被洒在上面),但这与根据蓝图建造的建筑物相关联的状态是不同且独立的。

public class House {
    private static boolean isCoffeeSpilt;

    private boolean isDoorOpen;

    public static void spillCoffee() {
        House.isCoffeeSpilt = true;
    }

    public void openDoor() {
        isDoorOpen = true;
    }
}

public static class Program {
    public static void main(String[] args) {
        House redHouse = new House();   // 1
        House blueHouse = new House();  // 2

        redHouse.openDoor();            // 3

        House.spillCoffee();            // 4
    }
}

在上面的例子中,如果House是一个静态类,则无法实现第1、2和3行。请注意,openDoor是在House的实例上调用的,而spillCoffee是在类本身上调用的。还要注意,在第4行时,红房子的门已经打开,但蓝房子的门仍然关闭。

0
一个静态类无法被实例化(技术上是可以的,但只能一次),静态构造函数通常在第一次访问类时调用,这可能很难跟踪和协调。 如果您想要一个只收集一些实用方法的类,则静态类非常好。 .net框架中的数学就是一个很好的例子。此外,它们对于扩展方法也很有用。除此之外,我不使用它们。
如果您需要单个实例,并且不想受到静态类的限制,则单例模式非常有用。关于单例和静态类之间的区别,这里有一篇nice article
当然,非静态类必须被实例化,存储在变量中,并且可以多次实例化。
例如:
一个静态类,只是用于加载文件的帮助方法:
static class TextureHelper
{
   public static byte[] LoadFromFile(string aFileName);
}

一个单例,是创建纹理的主要入口点。
public sealed class TextureManager
{
   public static TextureManager Instance{get;set;}

   public Texture CreateTexture();
}

一个实际的纹理,在我的应用程序中可能有很多。

public class Texture
{

}

0
非静态类的一个优点是,静态类很难进行单元测试 - 它们不能轻松地被模拟,并且它们不支持接口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接