3

为什么 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

4 回答 4

11

不要把它看成初始化,把它看成设置。

如果您只想通过静态构造函数或在声明时对其进行初始化,请添加readonly关键字。

例如

public readonly static customer cust;

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

//Not Allowed
public Program()
{
    cust = new customer();
}
于 2013-07-31T17:09:49.383 回答
4

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

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

话虽如此,您需要在初始化之前了解类中的静态对象,并在覆盖它们的值之前检查它们是否为空。

于 2013-07-31T17:12:03.107 回答
2

您可以从任何非静态函数访问和修改静态变量,它只会在每次调用时覆盖该值。反之则不然——静态函数不能访问非静态变量。

于 2013-07-31T17:08:30.577 回答
0

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

于 2013-07-31T17:08:08.617 回答