C# 静态构造函数,静态变量执行顺序(精华版)(规正版)
一、成员初始化整体顺序
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# 静态构造函数,静态变量执行顺序(精华版)(规正版)的更多相关文章
- C# 静态构造函数,静态变量执行顺序(升华版)
上篇 是基本语法基础下的执行顺序,包括继承这个维度下的执行顺序,我们可以依照的规律顺下来,下面我们看下一些摸不到头脑的情况 我们实验 一个 类中的方法 去调用另一个非继承类的情况, 我们主要看下 ...
- java静态初始化块的执行顺序
先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...
- java中静态初始化块的执行顺序
在java中,其应该是先于所有的方法执行. 下面是测试代码: public class Test1 { static{ System.out.println("执行静态初始化块test1.. ...
- 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...
- java中的静态代码块等执行顺序
http://www.cnblogs.com/naruto469/p/3608459.html public class Print { 2 3 public Print(String s){ 4 S ...
- 1.7Oob封装 继承 访问修饰符 静态和构造方法的执行顺序
1:访问修饰符 private 同类中 默认 同类 同包 protect 同类 同包 子类 public 同类 ...
- 请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
答:执行顺序:静态初始化块->初始化块->构造函数 静态初始化块:在第一次加载类时执行,与对象的创建无关. 构造代码块:在调用构造方法时执行. 构造函数:在调用构造函数时执行.
- C#静态类,静态构造函数,静态变量
静态变量位于栈上,它是一个全局变量,在编译期就已经生成. public class Cow public static int count; private int id; { id = ++coun ...
- Java:构造器,构造代码块,静态代码块的执行顺序
1.构造器:与类同名且没有返回值,用来初始化类属性: 构造器又分为无参构造器和有参构造器 1.1:无参构造器 public class Contruction{ ...属性... public Con ...
随机推荐
- tomcat 服务形式检测
http://blog.chinaunix.net/uid-20449851-id-2369842.html
- [求助]linux同一目录可否挂载多个数据盘?
https://bbs.aliyun.com/read/281222.html?pos=20
- 算法 Tricks(四)—— 判断序列中的字符/数值是否交替出现
比如:353, 54545,数字都是交替出现的: bool alternate = true; for (int i = 0; i < M.size(); ++i){ if (M[i] != M ...
- VC和MATLAB混合开发经验总结
作者:朱金灿 来源:http://blog.csdn.net/clever101 前期准备: 1.请确认机器中已经安装Matlab主程序或(MCR)MATLAB Compiler Runtime(具体 ...
- python2.7一步步实现键盘和鼠标检测
由于现在python3的pyHook库还没有很完善: 所以选择了python2.7版本 关于环境的搭建 python2.7 用的是anaconda,直接去官网下载去安装就好用,不需要配置环境变量的, ...
- [慕课笔记]mongodb入门篇
一:对mongodb有一个系统的完备的了解,只有概念清楚了,才能更好的使用 二:学会mongodb数据库的搭建 首先:了解如何部署数据库的服务 搭建简单的单机服务到搭建具有冗余容错功能的复制集再到搭建 ...
- ZYNQ7000 LVDS接口输出配置
xilinx 7系列芯片不再支持LVDS33电平,在VCCO电压为3.3V的情况下无法使用LVDS25接口. 有些设计者想通过在软件中配置为LVDS25,实际供电3.3V来实现LVDS33也是无效的, ...
- 无意中发现Markdown,最终解放了我
文件夹 概述 换行 删除线 链接自己主动识别 表格 代码块高亮 定义列表 脚注 自己主动生成文件夹 參考资料 正文 概述 大部分情况下,Markdown的基本的语法已够我们使用,比方随性记录点东西.非 ...
- centos7 安装php环境和安装swoole
这仅是我在网上找了多个解决方法,搞定了我遇到的问题,做的一个记录,买这个服务器就是为了测试swoole,结果快到期了,swoole还没装好 感谢https://www.cnblogs.com/phpw ...
- php生成唯一字符串
$units = array(); //循环生成好多个唯一字符串 for($i=0;$i<1000000;$i++){ $units[]=md5(uniqid(md5(microtime(tru ...