字段,属性,方法
对象初始化过程
如果没有继承,顺序如下:
- 静态变量
- 静态构造函数
- 非静态变量
- 非静态构造函数
如果类有基类,那么基类和子类的初始化顺序如下:
- 继承类静态成员变量初始化
- 继承类静态构造函数调用
- 继承类实例变量初始化
- 基类静态静态成员变量初始化
- 基类静态构造函数调用
- 基类实例变量初始化
- 基类构造方法调用
- 继承类构造方法调用
静态变量和静态属性
类的静态变量和静态属性都是输入真个类的,而不是属于哪个类的实例的。都可以直接用ClassName.field和ClassProperty来访问。
但是类的静态变量和静态属性有什么差别呢?有些地方还是要注意下的。比如,类A有一个public的field(虽然field很少是public的),一个public的属性。每次我们访问A.field得到的都是同一个值吗?每次我们访问A.Property都是同一个值吗?
下面有个例子,大家可以
public class SimpleClass { public static int staticField = new Random().Next(); public static int StatidProperty { get { return new Random().Next(); } } public static int StaticProperty2 { get { return staticField; } } }
public class MyClass { public void Test() { int i1 = SimpleClass.StatidProperty; Thread.Sleep(2000); int i2 = SimpleClass.StatidProperty; Console.WriteLine(i1); Console.WriteLine(i2); Console.WriteLine("--------------"); int i3 = SimpleClass.staticField; Thread.Sleep(2000); int i4 = SimpleClass.staticField; Console.WriteLine(i3); Console.WriteLine(i4); Console.WriteLine("-----------"); int i5 = SimpleClass.StaticProperty2; Thread.Sleep(2000); int i6 = SimpleClass.StaticProperty2; Console.WriteLine(i5); Console.WriteLine(i6); } }
以下是运行结果
------ Test started: Assembly: Castle.DynamicProxy.Demo.dll ------
160653910
1987364442
--------------
160653910
160653910
-----------
160653910
160653910
1 passed, 0 failed, 0 skipped, took 6.15 seconds (Ad hoc).
其实很好理解,C#里的属性虽然和字段很类似,但属性的本质是方法。字段在申明时时必须初始化的,如果没有初始化,会给它一个默认值(即default(T),T是字段的类型)。也就是说,静态字段在申明时即确定了。所以上面实例中2次调用静态字段得到的都是同一个值。但是静态属性,我们可以理解为是一个静态方法。2次调用,返回的值是不一样的。