6

非静态类比静态类有什么优势?

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

4

5 回答 5

2

静态类与非静态类基本相同,但有一个区别:静态类不能实例化。换句话说,您不能使用 new 关键字来创建类类型的变量。因为没有实例变量,所以您可以通过使用类名本身来访问静态类的成员

静态类只有一个类本身的实例,因此您不能创建静态类的多个实例。

查看您的问题,如果类是静态的,则无法为以下属性设置两个不同的值,因为ClassName内存中只有一个实例

ClassName.MemberName

更多信息在

http://msdn.microsoft.com/en-us/library/79b3xss3.aspx

于 2012-05-23T09:54:30.537 回答
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);
}
于 2012-05-23T09:56:16.387 回答
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 行是不可能的。请注意,在whileopenDoor的实例上调用的是在类本身上调用。另请注意,在第 4 行的点,红房子的门是开着的,但蓝房子的门仍然是关着的。HousespillCoffee

于 2012-05-23T10:00:40.063 回答
0

非静态类的一个优点是静态类对单元测试来说很糟糕——它们不容易被模拟,而且它们不支持接口。

于 2012-05-23T09:56:14.523 回答
0

静态类不能被实例化(技术上它是实例化,但只有一次),并且静态构造函数“通常”在第一次访问该类时被调用,这可能难以跟踪和协调。如果您想要一个只收集一些实用方法的类,则静态类很好。.net 框架中的数学就是一个很好的例子。它们对于扩展方法也很有用。除此之外,我不使用它们。

如果您需要单个实例,并且不想被绑定到静态类的约束,那么单例模式非常有用。一篇关于单例和静态类之间区别的好文章。

当然,一个非静态类必须被实例化,存储在一个变量中并且可以被多次实例化。

例子:

一个静态类,只是加载文件的辅助方法:

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
{

}
于 2012-05-23T10:04:23.220 回答