c#入门-静态成员

猫的颜色,体重,长度,都是实例数据。
如果我不指定一只猫,无法回答这些问题。
我家的猫是黑色的,这颗树上的猫是黄色的,学校里经常来的那只流浪猫是棕色的。

但是,如果我问你猫有几条腿,你会不假思索地回答4条。
即便我没有指明哪一只猫。
这种数据就是和类绑定,而非实例数据。

静态成员

在成员前面加上static关键字修饰,可以使其成为静态成员。
静态成员通过类名访问,无法通过实例访问。
静态成员和实例成员不能重名(因为变量是可以和它自己的类名同名,如果同名会无法区分)

Foo.a = 10;
Foo.Boo();

class Foo
{
	public static int a;
	public static void Boo() { }
}

静态构造器

静态成员同样可以有只读字段,使用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() { }
}

实例成员和静态成员的关系

静态成员在类存在时就已经存在。所以实例成员可以使用静态成员。但静态成员不能使用实例成员。
静态成员和类绑定,类是唯一的,所以这个类下的静态成员也是唯一的。

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;
}

你可能感兴趣的:(#,面向对象,c#)