除了常量之外,何时在面向对象语言中使用静态/类变量是否有意义?

时间:2013-07-14 05:58:56

标签: c# class variables object static

是否有任何好的情况让一个类的所有对象共享变量会很好?当然还有常数。

3 个答案:

答案 0 :(得分:0)

没有一个答案。有各种各样的理由可以使用而不是使用。例如,一个类计数器检查从这个类创建的实例可以是一个类中的静态变量。这真的取决于你的编程和原因。

如果您在第一个答案上看here,那么还有一些答案

答案 1 :(得分:0)

静态变量可用于在类的所有实例之间共享变量,如下例所示:

    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变量。

答案 2 :(得分:0)

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

实施例

让我们说你有一本书。您可以通过添加bookCount的静态字段来跟踪书籍数量,并在创建图书时增加其值。
您可以查看@pcnThird答案以获取代码示例。

我最喜欢的静态变量用法

当我想使用一个应该表现为常量字段的字段时,我发现静态字段最有效,但我无法在编译时知道它的值。
例如,假设您有一个日志类。您可以创建此日志类的许多实例,并且每个实例都将记录到文件系统上的其他位置 如果您希望所有日志文件都具有相同的前缀(包括日期),则它不能是常量,因为日期有一个烦人的改变习惯...... 解决方案可以是static字段(我通常更喜欢static readonly,它在构造函数完成它的工作后充当常量。)

Public class Log
{
    public static readonly string LogFilenamePrefix;
    Public Static Log()
    {
        Log.LogFilenamePrefix = DateTime.Today.ToString()+"_MyLogFile";
    }

}

在此示例中,您还可以看到DateTime类使用静态Today变量,这将带我进入下一个示例:

明显的例子

当然,静态类的情况是你没有选择但使用静态变量......

P.S。有些人认为静态变量是邪恶的。看看this SO post