除了常量,在面向对象语言中使用静态/类变量什么时候有意义

本文关键字:静态 类变量 有意义 什么时候 常量 面向对象语言 | 更新日期: 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类都有自己的NameID变量。

答案是,在某些情况下,您希望使用静态变量,并让类的所有实例共享该变量。

示例

假设你有一本藏书。您可以通过添加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帖子。