除了常量,在面向对象语言中使用静态/类变量什么时候有意义
本文关键字:静态 类变量 有意义 什么时候 常量 面向对象语言 | 更新日期: 2023-09-27 18:22:10
真的有什么好的情况可以让一个类的所有对象共享一个变量吗?当然,除了常数。
没有一个答案。使用和不使用有各种各样的理由。例如,类计数器检查从这个类创建的实例中有多少可以是类中的静态变量。这真的取决于你在编程什么以及为什么。
如果你看看第一个答案,还有一些答案适合你
静态变量可用于在类的所有实例中共享一个变量,如本例所示:
class Program
{
static void Main(string[] args)
{
//Create new instances of the Employee class
Employee joe = new Employee("joe", 1);
Employee billy = new Employee("billy", 2);
Console.WriteLine(Employee.EmployeeCount);
Console.ReadKey();
}
}
class Employee
{
public string Name { get; set; }
public int ID { get; set; }
public static int EmployeeCount { get; set; }
public Employee(string n, int id)
{
this.ID = id;
this.Name = n;
EmployeeCount++;
}
}
与静态变量相反,实例变量允许每个Employee
类都有自己的Name
和ID
变量。
答案是是,在某些情况下,您希望使用静态变量,并让类的所有实例共享该变量。
示例
假设你有一本藏书。您可以通过添加bookCount的静态字段并在创建图书时增加其值来跟踪图书数量
您可以在@pcnThird answer中查看代码示例。
我最喜欢的静态变量用法
当我想使用一个应该表现为常量字段的字段时,我发现静态字段最有效,但在编译时我不知道它的值
例如,假设您有一个日志类。您可以创建该日志类的许多实例,并且每个实例都将记录到文件系统上的不同位置
如果你希望所有日志文件都有相同的前缀,包括日期,它不能是一个常量,因为日期有一个令人讨厌的更改习惯。。。解决方案可以是static
字段(我通常更喜欢static readonly
,它在构造函数完成任务后充当常量)。
Public class Log
{
public static readonly string LogFilenamePrefix;
Public Static Log()
{
Log.LogFilenamePrefix = DateTime.Today.ToString()+"_MyLogFile";
}
}
在这个例子中,您还可以看到DateTime类用作静态Today
变量,这将使我进入下一个例子:
显而易见的例子
当然,在静态类的情况下,你别无选择,只能使用静态变量。。。
附言:有些人认为静态变量是邪恶的。看看这个SO帖子。