为什么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();
}
}
答案 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)
这只意味着每次初始化新对象时都会重置静态变量。有点奇怪,但编译器允许它。