为什么C#允许在非静态构造函数中初始化静态类变量?

时间:2013-07-31 17:05:56

标签: c# variables static constructor initialization

为什么C#允许在非静态构造函数中初始化静态类变量?只应允许在静态构造函数上初始化静态变量。有任何想法吗?

 public class customer
{
    public string Name;

    public customer()
    {
        Name = "C1";
        Console.WriteLine("creating customer " + Name);
    }

}

class Program
{
    public static customer cust;

    public Program()
    {
        cust = new customer(); //Why is this allowed i.e. initialize a static variable in non-static constructor?
    }

    static void Main(string[] args)
    {
        Program program = new Program();
        program = new Program();

        Console.Read();
    }
}

4 个答案:

答案 0 :(得分:10)

不要将其视为初始化,请将其视为设置。

如果您只想通过静态构造函数或声明来初始化它,请添加readonly关键字。

E.g。

public readonly static customer cust;

//Allowed
static Program()
{
    cust = new customer(); 
}

//Not Allowed
public Program()
{
    cust = new customer();
}

答案 1 :(得分:4)

简短的回答是没有理由不允许这个。静态变量可以从类中的任何地方到达(如果它们是公共的,则在外部),构造函数也不例外。这包括更改其值或将其初始化为新值。

事实上,有几种模式可以利用这种行为。例如,在第一次实例化类时初始化静态对象(可能用于缓存初始化但未来不会更改的属性)。另一个用途可能是增加计数器以跟踪这些对象中有多少是活着的。

说到这一点,你想在初始化之前注意一个类中的静态对象,并在覆盖它们的值之前检查它们是否为null。

答案 2 :(得分:2)

您可以从任何非静态函数访问和修改静态变量,它只会在每次调用时覆盖该值。但情况恰恰相反 - 静态函数无法访问非静态变量。

答案 3 :(得分:0)

这只意味着每次初始化新对象时都会重置静态变量。有点奇怪,但编译器允许它。

相关问题