非静态类相对于静态类有什么优势
本文关键字:静态类 什么 相对于 | 更新日期: 2023-09-27 18:35:08
非静态类与静态类相比有什么优势?
静态类不需要实例化。 所以我们可以直接使用ClassName.MemberName
,那么非静态类有什么用
静态类与非静态类基本相同,但有一个区别:静态类不能实例化。换句话说,不能使用 new 关键字创建类类型的变量。由于没有实例变量,因此可以使用类名本身访问静态类的成员
静态类只有类本身的一个实例,因此不能创建静态类的多个实例。
看看你的问题,如果类是静态的,你不能为下面的属性设置两个不同的值,因为内存中只有一个ClassName
实例
ClassName.MemberName
更多信息请访问
http://msdn.microsoft.com/en-us/library/79b3xss3.aspx
假设您需要存储封装员工的信息和操作。
class Employee
{
string Name {get; set;}
double HourlyRate {get; set;}
double CalculatePay(int hoursWorked) { . . . }
}
现在,假设您的程序需要同时比较两个员工?
完全!使用非静态 employee 类,您可以实例化 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);
}
将类视为建筑蓝图,将该类(对象)的实例视为根据蓝图中的设计构建的建筑。
给定一个蓝图,您可以创建许多建筑物。这些建筑物中的每一个都有相同的结构,但每个都是独立的 - 一个可以打开门,而另一个可以关闭门。
静态类就像一个蓝图,永远不能用来建造任何房屋。你仍然可以做一些事情,比如撕毁它或把咖啡洒在上面,但你永远无法打开蓝图上的门,因为它没有真正的门,只有门的设计。
描述这种情况的另一种方法是考虑"状态"。建筑物(对象)具有某种状态(例如,门是否打开),并且每个建筑物的状态可以不同(例如,它自己的门是否打开)。蓝图(类)也可以具有(静态)状态(例如,咖啡是否洒在上面),但这与根据蓝图建造的建筑物相关的状态是不同的和分开的。
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
}
}
在上面的示例中,如果 1、2 和 3 行是静态类,则不可能House
行。 请注意,openDoor
是在House
实例上调用的,而spillCoffee
是在类本身上调用的。另请注意,在第 4 行的位置,红房子的门是打开的,但蓝房子的门仍然关闭。
静态类不能实例化(技术上是,但只能实例化一次),并且静态构造函数"通常"在第一次访问类时调用,这可能难以跟踪和协调。如果你想要一个只收集一些实用工具方法的类,静态类是很好的。.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
{
}
非静态类的一个优点是静态类对单元测试来说很糟糕 - 它们不容易被嘲笑,并且它们不支持接口。