C#中静态变量的初始化
类的静态字段变量初始值设定项对应于⼀个赋值序列,这些赋值按照它们在相关的类声明中出现的⽂本顺序执⾏。
如果类中存在静态构造函数则静态字段初始值设定项的执⾏在该静态构造函数即将执⾏前发⽣。
否则,静态字段初始值设定项在第⼀次使⽤该类的静态字段之前先被执⾏,但实际执⾏时间依赖于具体的实现。在以下⽰例中:
using System;
class Test
{
static void Main() {
Console.WriteLine("{0} {1}",B.Y, A.X);
}
public static int F(string s) {
Console.WriteLine(s);
return 1;
}
}
class A
{
public static int X= Test.F("Init A");
}
class B
{
public static int Y= Test.F("Init B");
}
或者产⽣如下输出:
Init A
Init B
1 1
或者产⽣如下输出:
Init B
Init A
1 1
这是因为 X 的初始值设定项和 Y的初始值设定项的执⾏顺序⽆法预先确定,上述两种顺序都有可能发⽣;唯⼀能够确定的是:它们⼀定会在对那些字段的引⽤之前发⽣。但是下⾯的⽰例:
using System;
writeline输出数值变量class Test
{
static void Main() {
Console.WriteLine("{0} {1}",B.Y, A.X);
}
public static int F(string s) {
Console.WriteLine(s);
return 1;
}
}
class A
{
static A() {}
public static int X= Test.F("Init A");
}
class B
{
static B() {}
public static int Y= Test.F("Init B");
}
所产⽣的输出必然是:
Init B
Init A
1 1
这是因为关于何时执⾏静态构造函数的规则规定
(静态构造函数⽤于初始化任何静态数据,或⽤于执⾏仅需执⾏⼀次的特定操作。在创建第⼀个实例或引⽤任何静态成员之前,将⾃动调⽤静态构造函数。):B的静态构造函数(以及B的静态字段初始值设定项)必须在A的静态构造函数和字段初始值设定项之前运⾏。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。