• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#实例化的执行顺序(转)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

首先进行细分
1.类的成员分为:字段,属性,方法,构造函数
2.成员修饰符:静态成员,实例成员
不考虑继承的关系执行顺序为:
1.静态字段
2.静态构造方法
3.实例字段
4.实例构造方法
其中 属性和方法只有在调用的时候才执行。
下面是一段代码例子:

 class Test
        {
            public static int temp;
            public int mNum;
            public int mNum2 = 2;
            public void Look()
            {
                Console.WriteLine("看我,我是test");
                Console.WriteLine("mNum={0}", mNum);
            }
            private int mNum3 = 3;
            private readonly int mNum4 = 4;
            public int Num3
            {
                get { return mNum3; }
                set { mNum3 = value; }
            }
            public Test()
            {
                temp = 1;
                mNum = 0;
            }
        }

定义了一个类,当我们实例化的时候
Test test = new Test();
 执行过程是:
0. 静态的最先执行,仿真编译略过
1. F11 执行 public int mNum2=2; //简单的初始化字段
2. private int mNum3 = 3;
private int mNum4 = 4;
3. public Test() { temp = 1;mNum = 0; } //构造函数

注意:public int mNum;也执行了,只不过系统默认赋值0

当存在继承关系的时候,执行的顺序。
1. 子类的静态字段
2. 子类的静态构造方法
3. 子类的实例字段
4. 父类的静态字段
5. 父类的静态构造方法
6. 父类的实例字段
7. 父类的实例构造方法
8. 子类的实例构造方法

 class A : Test
        {
            readonly int x = 1;
            public A()
            {
                PrintFields();
                Look();
            }

            readonly int c;
            readonly int sd = 6;
            public virtual void PrintFields()
            {
                Console.WriteLine("j={0},k={1}", "AA", "AA");
            }
        }
        class B : A
        {
            readonly int y;
            int z = 2;
            public B()
            {
                z = -1;
            }
            public override void PrintFields()
            {
                Console.WriteLine("x={0},y={1}", "b", z);
            }
        }
        class C : B {
            int x = 1;
            int y = 3;
            public override void PrintFields() {
                Console.WriteLine("j={0},k={1}", "CC", y);
            }
        }


        static void Main(string[] args)
        {
            Console.WriteLine("======实例化Test======");
            Test test = new Test();
            Console.WriteLine("======实例化A======");
            A a = new A();
            Console.WriteLine("======实例化B======");
            B b = new B();
            Console.WriteLine("======实例化C======");
            C c = new C();
            Console.ReadKey();
        }

1. 首先执行 class A中 int x = 1;,执行所有已经初始化后的字段,当执行到构造函数首执行父类字段

2. int sd = 6;

3. public A(),首先会去执行父类。

4. 0. 静态的最先执行,仿真编译略过 1. F11 执行 public int mNum2=2; //简单的初始化字段 2. private int mNum3 = 3; private int mNum4 = 4; 3. public Test() { temp = 1;mNum = 0; } //构造函数

5. public A() { PrintFields(); look(); }// 执行子类中自己的构造函数

6. public virtual void PrintFields() ;执行自己类中有意义的虚函数

7. 执行调用父类的函数 look();

8. 接下来就将要执行 class B 中的内容了。过程类似,先一步一步的执行A类,在执行Test类,实现继承。

9. 忽略部分细节,降调B类中的细节。

int z=2;

public B() 运行到这里的时候,再次执行到 public A() { PrintFields(); look(); } 的构造函数的时候,由于执行的是实例化B类,又在B类中重写了PrintFields();,实现多态。

所以执行 public override void PrintFields() { Console.WriteLine("x={0},y={1}", "b", z); } 所以此时的 z=2; 而不是 public B() { z = -1; } 中的z=-1,因为还没有执行到它,随后才执行子类中的构造函数。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
(转)C#的usb通讯编程发布时间:2022-07-10
下一篇:
C#中的is和as的转型区别发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap