非静态类相对于静态类有什么优势?
静态类不需要实例化,所以我们可以直接使用ClassName.MemberName
,那么非静态类有什么用处呢?
ClassName.MemberName
更多信息请访问
class Employee
{
string Name {get; set;}
double HourlyRate {get; set;}
double CalculatePay(int hoursWorked) { . . . }
}
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);
}
把一个类比作建筑蓝图,该类的实例(即对象)则是按照蓝图中设计所建造的建筑物。
有了一个蓝图,你可以创建很多建筑物。这些建筑物都具有相同的结构,但是每个都是独立的 - 一个可能门开着,而另一个门关着。
静态类就像一份永远不能用来建造房屋的蓝图。你仍然可以做一些事情,比如将其撕毁或洒咖啡在上面,但是你永远不能打开蓝图上的门,因为它没有实际的门,只有门的设计。
另一种描述这种情况的方式是考虑“状态”。一座建筑(对象)具有一些状态(例如门是否开着),每座建筑的状态可以不同(例如它自己的门是否开着)。一个蓝图(类)也可以有(静态的)状态(例如咖啡是否被洒在上面),但这与根据蓝图建造的建筑物相关联的状态是不同且独立的。
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行时,红房子的门已经打开,但蓝房子的门仍然关闭。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
{
}
MemberName
是静态的,但类不是静态的,您也可以直接使用ClassName.MemberName
。当您不需要(也永远不会)创建该类的实例时,请将类设置为静态。这对于扩展类来说是必不可少的。 - Tim Schmelter