C#类的成员初始化顺序

C#作为一种纯面向对象的话言,为它编写的整个代码里面到处都离不开对象。一个对象的完整的生命周期是从开始分配空间到初始化,到使用,最后是销毁,使用的资源被回收。要想真正写出面高质量的代码,我们就得对这期间每一个阶段是怎么样一个状态,framework都做了些什么,我们又能够做些什么都要有些了解才行。

一般来说大部分程序员对于一个创建好了的对象怎么使用都是比较清楚的,所以本文也就不想就这一部分做太多的说明,重点就集中开对象的创建和销毁这两个阶段,这也是程序员最容易范错误的阶断。本文首先来讲一讲对象成员的初始化,至于对象的释放和销毁,我想放到另外一篇文章里去讲。虽然本文是以C#2005 为例的,但推而广之,对于其它的基于CLS规范的语言应该也是一样的。

首先我们来看看引用类型的成员初始化过程

我们来看一个例子吧

1class Program
2{
3 static void Main(string[] args)
4 {
5 DriveB d = new DriveB();
6 }
7}
8
9class BaseA
10{
11 static DisplayClass a = new DisplayClass("基类静态成员初始化");
12
13 DisplayClass BaseA_c = new DisplayClass("基类实例变量BaseA_c初始化");
14
15 public BaseA()
16 {
17 Console.WriteLine("基类构造方法被调用");
18 }
19}
20
21class DriveB : BaseA
22{
23 static DisplayClass DriveB_b = new DisplayClass("继承类静态成员DriveB_b初始化");
24
25 //static BaseA DriveB_a = new BaseA();
26
27 DisplayClass DriveB_c = new DisplayClass("继承类实例变量DriveB_c初始化");
28
29 public DriveB()
30 {
31 Console.WriteLine("继承类构造方法被调用");
32 }
33}
34class DisplayClass
35{
36 public DisplayClass(string diplayString)
37 {
38 Console.WriteLine(diplayString);
39 Console.WriteLine();
40 }
41}

时间: 2024-10-29 12:42:18

C#类的成员初始化顺序的相关文章

java类中元素初始化顺序详解_java

复制代码 代码如下: public class Test4 {    @Test    public void test(){        child child = new child();    }} class parent{    public static String parentStaticField = "父类静态变量";    public String parentNormalField ="父类普通变量";    static {      

java笔记一:类成员的初始化顺序

最近一直在看<thinking in java>一书,感觉里面东西讲的很细,很多东西都没有接触过,是值得各位java程序员仔细品味的一本好书. 今天看了关于类成员初始化那节,以前对于成员初始化顺序没有考虑那么多,没有在意初始化的顺序.今天特意仔细研究了一番. 一个类中,最首先被初始化的是静态成员,也就是有关键字static修饰的成员.只要一个类被使用也就是创建对象或者调用了该类的某个静态方法时静态成员就都会被初始化,并且静态数据在内存中只占用一份存储区域,无论创建多少个对象,静态数据被所有对象

C++:类的成员变量 声明顺序 与 初始化顺序 相同

类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行; 否则, 在变量之间交替赋值时, 会产生, 未初始化的变量去赋值其他变量; 同时GCC, 也会发出警告, 如: 'class::m_xxx' will be initialized after [-Wreorder] 代码: /* * BInsertSort.cpp * * Created on: 2014年4月15日 * Author: Spike */ #include <ios

Java 类中类属性和对象属性的初始化顺序

对象 边城狂人 Java 类中类属性 (static 变量) 和对象属性 (非 static 变量) 的初始化顺序可以用如下程序测试: /** * @(#) Test.java * @author fancy */ public class Test { static String a = "string-a"; static String b; String c = "stirng-c"; String d; static { printStatic("

java 初始化-Java类的初始化顺序问题

问题描述 Java类的初始化顺序问题 一般在Java对象能够调用方法之前,此类中的成员变量就已经初始化完毕,那如果这个成员是匿名内部类呢?也会等到这个匿名内部类中的代码全部跑完吗? 解决方案 Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)4,装载子类B后,完成静态动作类装载完成,

java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

问题描述 java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的? class Demo03 { public static void main(String[] args) { A.show(); } } class A { //构造方法 A(){ System.out.println("构造方法执行"); System.out.println(b); System.out.println(c); } static A a=new A(); sta

C++成员变量、构造函数的初始化顺序

一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): static变量属于类所有,而不属于类的对象,因此不管类被实例化了多少个对象,该变量都只有一个.在这种性质上理解,有点类似于全局变量的唯一性. 函数体内static变量的作用范围时该函数体,不同于auto变量,该变量内存只被分配一次,因此其值在下次调用时维持上次的值. 在模块内的static全局变量可以

C++成员变量的初始化顺序问题

问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下,   [cpp] view plaincopyprint?   class A   {   private:       int n1;       int n2;          public:       A():n2(0),n1(n2+2){}          void Print(){           cout << "n1:" << n1 << ", n

关于java类初始化顺序的问题

问题描述 关于java类初始化顺序的问题 正常来说一个类的初始化过程应该是: 1.全局静态变量 2.静态代码块 3.全局变量 4.代码块 5.构造器 有这么一个例子: public class LoadTest { //全局静态变量 static int staticI = 10; //全局变量 int i = 20; //构造器 private LoadTest() { System.out.println("staticI="+staticI); System.out.printl