真的有什么好的情况可以让一个类的所有对象共享一个变量吗?当然,除了常数。
3 回答
静态变量可用于在类的所有实例之间共享一个变量,如下例所示:
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 答案以获取代码示例。
我最喜欢的静态变量用法
当我想使用一个应该作为常量字段的字段时,我发现静态字段最有效,但我不知道它在编译时的值。
例如,假设您有一个日志类。您可以创建此日志类的许多实例,并且每个实例都将记录到文件系统上的不同位置。
如果您希望所有日志文件都具有相同的前缀,包括日期,它不能是一个常数,因为日期有一个令人讨厌的改变习惯......解决方案可能是一个static
字段(我通常更喜欢一个static readonly
充当构造函数完成它的工作后的常量)。
Public class Log
{
public static readonly string LogFilenamePrefix;
Public Static Log()
{
Log.LogFilenamePrefix = DateTime.Today.ToString()+"_MyLogFile";
}
}
在此示例中,您还可以看到 DateTime 类用作静态Today
变量,这将我带到下一个示例:
明显的例子
当然,在静态类的情况下,您别无选择,只能使用静态变量......
PS 有些人认为静态变量是邪恶的。看看这个 SO 帖子。
对此没有一个答案。有各种理由使用和不使用。例如,一个类计数器检查从这个类中创建的有多少实例可能是一个类中的一个静态变量。这真的取决于你在编程什么以及为什么。
如果您在第一个答案上看这里,那么还有一些答案适合您