一、成员初始化整体顺序

1.成员赋值初始化先于构造函数;

2.成员赋值初始先从子类再到基类;

3.构造函数初始化先从基类再到子类;

4.静态成员初始化优先于实例成员初始化;

二、对类型静态成员构造的大致过程

1.分配静态成员的内存空间,此时空间存储数据为0;

2.执行类的静态成员的初始化语句;

3.执行类的静态构造函数。

三、对类型实例成员构造的大致过程

1.分配实例成员的内存空间,此时空间存储数据为0;

2.执行子类实例成员初始化语句;

3.执行基类实例化成员初始化语句;

4.执行基类构造函数;

5.执行子类构造函数;

四、同时有静态成员和实例成员的大致构造过程

1.执行子类静态成员初始化语句;

2.执行子类静态构造函数;

3.执行子类实例成员初始化语句;

4.执行基类静态成员初始化语句;

5.执行基类静态构造函数;

6.执行基类实例成员初始化语句;

7.执行基类实例构造函数;

8.执行子类实例构造函数。

五、说明

1.C#中静态构造函数都是私有的,不能为其添加访问修饰符;

2.只有创建类的实例或调用任何静态成员时才能激发静态构造函数;

3.调用一个未初始化类的静态成员时,他会先去初始化这个类的静态成员和静态构造函数。

总结

派生类构造函数,作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递给适当的基类构造函数,

否则两个类的实现变成紧耦合(tightly coupled)将更加难于正确地修改或扩展基类的实现(基类设计者的责任是提供一组适当的基类构造函数)

C#没有java的静态代码块和匿名代码块,

C#静态成员和实例成员是从子类到父类,构造函数是从父类到子类的

而java都 静态成员和静态代码块是从父类到子类的,实例成员和构造函数是从父类到子类

C#静态代码块:static Parent() 不能有任何修饰符

C# 子类会把静态,静态构造函数,实例执行完毕,再执行父类,再构造函数

java 先父类静态,再子类静态,然后父类实例,子类实例,最后一样



class Class1
{
public static int Count = 0;
static Class1()
{
Count++;
}
public Class1()
{
Count++;
}
}
Class1 c = new Class1();
Class1 cc = new Class1();
Console.WriteLine(Class1.Count.ToString());
Console.Read();

当第一次实例化时, Count值变成2, 当第二次实例化时, 则不会执行静态构造函数与静态变量. 此时Count的值变成3. 所以,最后结果Count值为3


class Program
{
static void Main(string[] args)
{
father test = new son();
test.print();
Console.WriteLine("输入任意字符结束...");
Console.ReadKey();
}
class father
{
public static string staticstr = "静态字符串 ";
public string fatherstr = "父类字符串 ";
public father()
{
Console.WriteLine("{0}",staticstr);
staticstr = "静态字符串在父类中改变";
print();
}
public virtual void print() { }
}
class son : father
{
string sonstr = "子类字符串 ";
string changestr = "暂时还未改变 ";
public son()
{
staticstr = "静态字符串在子类中改变";
changestr = "字符串改变";
}
public override void print()
{
Console.WriteLine("{0},{1},{2},{3}",staticstr,fatherstr,sonstr,changestr);
}
} }
}

代码执行:

加载类

初始化子类静态成员  无

初始化子类静态构造函数  无

初始化子类实例成员  string sonstr = "子类字符串 ";  string changestr = "暂时还未改变 ";

初始化父类静态成员   staticstr = "静态字符串 ";

初始化子类静态构造函数 没有

初始化父类实例成员  fatherstr = "父类字符串 ";

初始化父类静态成员

初始化父类构造函数

Console.WriteLine("{0}",staticstr);

staticstr = "静态字符串在父类中改变";

print();

Console.WriteLine("{0},{1},{2},{3}",staticstr,fatherstr,sonstr,changestr);

初始化子类构造函数

staticstr = "静态字符串在子类中改变";

changestr = "字符串改变";

结果 :静态字符串  静态字符串在父类中改变, 父类字符串, 子类字符串,暂时还未改变

静态字符串在子类中改变, 父类字符串, 子类字符串,字符串改变


class Program
{
static void Main(string[] args)
{
Parent obj1 = new Child();
Parent obj2 = new Child();
Console.ReadKey();
}
} public class Print
{
public Print(String s)
{
Console.WriteLine(s);
} } public class Parent
{
public static Print obj1 = new Print("1");
public Print obj2 = new Print("2");
public static Print obj3 = new Print("3");
static Parent()
{
new Print("4");
}
public static Print obj4 = new Print("5");
public Print obj5 = new Print("6");
public Parent()
{
new Print("7");
} }
public class Child : Parent
{
static Child()
{
new Print("a");
}
public static Print obj1 = new Print("b");
public Print obj2 = new Print("c");
public Child()
{
new Print("d");
}
public static Print obj3 = new Print("e");
public Print obj4 = new Print("f");
}

先加载子类静态成员 b e

在加载子类静态构造函数 a

初始化子类实例成员 c f

先加载父类静态成员 1 3 5

在加载父类静态构造函数 4

初始化父类实例成员 2 6

父类构造函数 7

子类构造函数 d

初始化子类实例成员 c f

初始化父类实例成员 2 6

父类构造函数 7

子类构造函数 d

最后结果:beacf1354267dcf267d

还有不规则的呢,请看下片 点这里

C# 静态构造函数,静态变量执行顺序(精华版)(规正版)的更多相关文章

  1. C# 静态构造函数,静态变量执行顺序(升华版)

    上篇 是基本语法基础下的执行顺序,包括继承这个维度下的执行顺序,我们可以依照的规律顺下来,下面我们看下一些摸不到头脑的情况 我们实验 一个 类中的方法 去调用另一个非继承类的情况,  我们主要看下  ...

  2. java静态初始化块的执行顺序

    先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...

  3. java中静态初始化块的执行顺序

    在java中,其应该是先于所有的方法执行. 下面是测试代码: public class Test1 { static{ System.out.println("执行静态初始化块test1.. ...

  4. 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序

    一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...

  5. java中的静态代码块等执行顺序

    http://www.cnblogs.com/naruto469/p/3608459.html public class Print { 2 3 public Print(String s){ 4 S ...

  6. 1.7Oob封装 继承 访问修饰符 静态和构造方法的执行顺序

    1:访问修饰符 private     同类中 默认        同类        同包 protect    同类         同包      子类 public     同类        ...

  7. 请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

    答:执行顺序:静态初始化块->初始化块->构造函数 静态初始化块:在第一次加载类时执行,与对象的创建无关. 构造代码块:在调用构造方法时执行. 构造函数:在调用构造函数时执行.

  8. C#静态类,静态构造函数,静态变量

    静态变量位于栈上,它是一个全局变量,在编译期就已经生成. public class Cow public static int count; private int id; { id = ++coun ...

  9. Java:构造器,构造代码块,静态代码块的执行顺序

    1.构造器:与类同名且没有返回值,用来初始化类属性: 构造器又分为无参构造器和有参构造器 1.1:无参构造器 public class Contruction{ ...属性... public Con ...

随机推荐

  1. PythonOOP面向对象编程3

    override 函数重写 重写是在自定义的类内添加相应的方法,让自定义的类生成的对象(实例)像内建对象一样进行内建的函数操作 对象转字符串函数重写 repr(obj) 返回一个能代表此对象的表达式字 ...

  2. Surging 微服务框架使用入门

    原文:Surging 微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正.  我对 surging 的看法 我目前所在的公司采用架构就是类似与Sur ...

  3. 【Codeforces Round #299 (Div. 2) B】Tavas and SaDDas

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每次取出最小的数字,在后面加上一个4或一个7就好; 会发现最后的数字很少的. [代码] #include <bits/stdc ...

  4. Eclipse中开发环境也想把Tomcat 的默认BIO模式改为NIO模式

    1.1 问题 有时候,开发环境我们也想把Tomcat 的默认BIO模式改为NIO模式,该如何改呢? 1.2 方案 通过eclipse里面的server.xml进行修改. 1.3 步骤 首先我们来一起看 ...

  5. 管理aix的密码策略

    aix 中 /etc/security/user 存放用户的概要 常用参数参数如下 1.account_locked      defines whether the account is locke ...

  6. javascript面对对象编程 之继承

    上一篇博客中为大家介绍了javascript面向对象编程原则的封装,今天为大家介绍继承.在javascript中没有类的概念,全部不能像c#.java语言那样.直接的用类去继承类.比方如今有比方.如今 ...

  7. Linux下的lds链接脚本简介(四)

    十一. 表达式 lds中表达式的文法与C语言的表达式文法一致,表达式的值都是整型,如果ld的运行主机和生成文件的目标机都是32位,则表达式是32位数据,否则是64位数据. 以下是一些常用的表达式: _ ...

  8. 18、x264编码在zedboard上的实现(软编码)

    一.x264开源包获取 x264-snapshot提供了开源x264源代码,已经在X86和ARM架构下均已实现.linux下可以使用git获得最新的代码包 git clone git://git.vi ...

  9. PL/SQL精明的调用栈分析

    PL/SQL精明的调用栈分析 原文:http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html ...

  10. css3-11 如何改变背景图片的大小和位置

    css3-11 如何改变背景图片的大小和位置 一.总结 一句话总结:css3相对css2本身就支持改变背景图片的大小和位置. 1.怎么设置背景不填充padding部分? background-orig ...