静态成员的初始值赋值
实例成员在赋值时可以使用静态成员作为初始值。
无论是构建包含静态字段属性的表达式,还是调用静态方法获取返回值。
因为静态成员先于实例成员存在,在构建实例成员时,静态成员必然已经构造完成。
class 小兵
{
public int 攻击 = 默认攻击;
public int 防御 = 默认防御;
public int 生命 = 默认生命;
public static int 默认攻击;
public static int 默认防御;
public static int 默认生命;
}
实例字段在赋值初始值时,不能使用其他的实例成员。
但静态字段可以使用其他的静态成员构建初始值。
只不过静态字段有先后顺序之分。
静态字段的初始值赋值会从上到下依次进行。
如果使用了还没有赋值初始值的字段,那么此时这个对这个字段取值就是默认值。
Console.WriteLine(Foo.a);
Console.WriteLine(Foo.b);
Console.WriteLine(Foo.c);
Console.WriteLine(Boo.a);
Console.WriteLine(Boo.b);
Console.WriteLine(Boo.c);
class Foo
{
public static int a = b;
public static int b = ++c;
public static int c = 10;
}
class Boo
{
public static int a = 10;
public static int b = ++a;
public static int c = b;
}
静态构造器
静态成员同样可以有只读字段,和使用init访问器的属性。
他们可以通过静态构造器赋初始值。
静态构造器声明语法是在一个无参实例构造器前加static修饰。
静态构造器在你第一次访问这个类时调用。
和终结器一样,因为不由人为控制,所以无法添加参数和访问修饰符。
Console.WriteLine(Boo.i);
Foo.Nope();
Console.WriteLine(Boo.i);
class Boo
{
public static int i = 0;
}
class Foo
{
static Foo()
{
Boo.i = 20;
}
public static void Nope() { }
}
静态类
如果一个类只有静态成员,那么可以将类修饰为静态类。
静态类将不允许声明实例构造器,包括编译器自动添加的默认构造器。
无法声明静态类的变量。通常,静态类都是作为工具类使用。