C#之静态字段初始化
当⼀个字段声明中含有 static 修饰符时,由该声明引⼊的字段为静态字段(静态变量)。当不存在static修饰符时,由该声明引⼊的字段为实例字段(实例变量)。
静态字段不属于某个特定的实例;相反,它只标识了⼀个存储位置。不管创建了多少个类实例,对于关联的应⽤程序域来说,在任何时候静态字段都只会有⼀个副本。实例字段属于某个实例。具体说来,类的每个实例都包含了该类的所有实例字段的⼀个单独的集合。
(2)字段声明可以包含变量初始值设定项,两者初始化区别如下:
对于静态字段,变量初始值设定项相当于在类初始化期间执⾏的赋值语句。
对于实例字段,变量初始值设定项相当于创建类的实例时执⾏的赋值语句。
⽰例如下:
using System;
class Test
{
static double x = Math.Sqrt(2.0);
int i = 100;
string s = "Hello";
static void Main() {
Test a = new Test();
Console.WriteLine("x = {0}, i = {1}, s = {2}", x, a.i, a.s);
}
}
产⽣输出:
x = 1.4142135623731, i = 100, s = Hello
这是因为对x的赋值发⽣在静态字段初始值设定项执⾏时,⽽对i和s的赋值发⽣在实例字段初始值设定项执⾏时。
(3)类的静态字段变量初始值设定项对应于⼀个赋值序列,这些赋值按照它们在相关的类声明中出现的⽂本顺序执⾏。如果类中存在静态构造函数,则静态字段初始值设定项的执⾏在该静态构造函数即将执⾏前发⽣。否则,静态字段初始值设定项在第⼀次使⽤该类的静态字段之前先被执⾏,但实际执⾏时间依赖于具体的实现。
如下⽰例:
using System;
class Test
{
static void Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
public static int F(string s) {
Console.WriteLine(s);
return1;
}
}
class A
{
public static int X = Test.F("Init A");
}
class B
{
public static int Y = Test.F("Init B");
writeline方法属于类}
或产⽣输出
Init B
Init A
11
这是因为X的初始值设定项和Y的初始值设定项的执⾏顺序⽆法预先确定,上述两种顺序都有可能发⽣;唯⼀能够确定的是:它们⼀定会在对那些字段的引⽤之前发⽣。但是,下⾯的⽰例:
using System;
class Test
{
static void Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
public static int F(string s) {
Console.WriteLine(s);
return1;
}
}
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
11
这是因为关于何时执⾏静态构造函数的规则(在中定义)规定:B的静态构造函数(以及B的静态字段初始值设定项)必须在A的静态构造函数和字段初始值设定项之前运⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论