C# 实例化类的执行顺序
先进行细分:
类的成员分为:字段、属性、方法、构造方法
成员的修饰符:静态成员、实例成员
层次结构:父类、子类
先不考虑继承关系,执行顺序为:
- 静态字段
 - 静态构造方法
 - 实例字段
 - 实例构造方法
 
属性和方法是在调用的时候才执行,这里就不考虑了。如何理解上面的执行过程?假如让我来设计执行过程,我该如何考虑,依据是什么?
首先,静态的东西是大家共享的,也就是相同的。应该先关心共享的东西,再关系个人的东西。“先公后私”,呵呵。
其次,实例化之前,应该先初始化自己的内部数据。
现在考虑继承关系,执行顺序为:
- 子类的静态字段
 - 子类的静态构造方法
 - 子类的实例字段
 - 父类的静态字段
 - 父类的静态构造方法
 - 父类的实例字段
 - 父类的实例构造方法
 - 子类的实例构造方法
 
在子类的实例字段和子类的实例构造方法之间,加入了父类的执行顺序。这个其实也很好理解:在子类的实例构造方法之前,确实需要知道父类的信息,因为子类要从父类那里继承一些东西。这就好比,没有老子,哪来的儿子呢,呵呵。
这里需要特别注意的是,并不是每次实例化都是上面的顺序。因为静态的成员只是在第一次实例化的时候执行,以后再实例化都不会在执行。很好理解,静态的成员意味着大家共享,且只有这一个。第一次实例化得到静态成员后,以后大家都共享,再次实例化,没有必要也不允许执行静态成员的部分。
补充说明:
1、构造引用类型的对象时,调用实例构造方法之前,为对象分配的内存总是先被归零,构造器没有显式重写字段,字段的值为0或者null
2、原则上讲,类中的字段应该在实例构造方法内初始化。C#编译器提供了简化的语法,允许在变量定义的时候初始化。但在幕后,C#会把这部分代码搬到构造方法内部。因此,这里存在代码膨胀的问题。多个字段在定义时初始化,同时存在多个构造方法,每个构造方法都会把这些字段初始化的代码搬到自己的内部,这样造成代码的膨胀。为了避免这样情况,可以把这些字段的初始化放到一个无参构造方法内,其他的构造方法显式调用无参构造方法。
3、初始化类的字段有两种方法,①使用简化语法,在定义的时候初始化;② 在构造方法内初始化。使用简化语法初始化的代码,会被搬到构造方法内。特别注意,在生成的IL中,父类构造方法会夹在 ①和②之间。因此,实例化子类的时候,会先执行①,再执行父类构造方法,然后执行②。现在问题来了,假如在父类构造方法内,调用虚方法,虚方法回调子类的方法,子类方法使用字段,这时候字段的值是简化语法初始化的值。
C# 实例化类的执行顺序的更多相关文章
- java类的初始化程序块以及被实例化时候的执行顺序
		
初始化块:在类实例化过程中初始化执行顺序是先执行静态初始化块,然后执行普通初始化块,最后执行构造函数,而且静态初始化只在第一次被实例化时执行且只执行一次.public class HelloWorld ...
 - Java类的执行顺序
		
在Java中一个类包括:构造块.构造方法.静态块.main方法.普通方法. 通过下面的例子将看出一个类中各种方法的执行顺序: /** * @author zhengbinMac */ public c ...
 - [1]朝花夕拾-JAVA类的执行顺序
		
最近在温习java的基础,刷题刷到java的执行顺序,很汗颜,答案回答错了! 题目类似如下: package com.phpdragon.study.base; public class ExecOr ...
 - C# 基类派生类构造函数执行顺序分析
		
using System; namespace ConsoleApp1 { class Program{ static void Main(string[] args){ B b = new B(); ...
 - 深入了解Java程序执行顺序
		
Java中main方法,静态,非静态的执行顺序详解 Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独 ...
 - UIViewController的生命周期及iOS程序执行顺序  和ios6 处理内存警告
		
当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc 创建对象,分配空间2.init (initWithN ...
 - Java静态变量、静态块、构造块、构造函数、main函数、普通代码块的执行顺序
		
测试代码 public class SingleTest { public static String v = "StaticValue"; static { System.out ...
 - Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
		
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
 - 图示Java类的初始化顺序
		
Java类的初始化顺序 在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行. 以下为代码验证阶段,一共三个类 ...
 
随机推荐
- mysql无法应用安全设置的解决方法
			
如果重复安装mysql,可能会导致这个错误,所以需要: 卸载mysql,把mysql的安装目录彻底删除,默认是 C:\Program Files\MySQL 删除后重新安装即可成功
 - 由 Session 和 Cookie 的区别说起
			
Session 和 Cookie 有什么区别? 最近面试被问到这个问题,和面试官一番讨论了解到面试官心里的答案后,我不太满意. 面对上面的问题,如果是刚毕业时的我,一定会毫不犹豫说出 Cookie 是 ...
 - UWP Xaml设计器中输入特殊字符
			
<TextBox Text="欢迎使用小冰科技最新研发的自然语言处理程序.小冰科技旗下还有强大的人脸识别软件——<微识别>,自动追踪和识别人脸:具有科普性质的.清新脱俗的识 ...
 - .net mvc中session的锁机制
			
今天遇到个奇怪的问题, 一个秒杀商品系统, 大量秒杀请求进来, 到了action居然是单线程执行! 这样产生的效果就是“这个系统好慢啊!!”. 可是我没有加lock,为什么会变成单线程执行呢? 找资料 ...
 - Scrapy爬取携程桂林问答
			
guilin.sql: CREATE TABLE `guilin_ask` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `question ...
 - Selenium+Python自动化测试学习问题总结笔记
			
1.问题描述:不能导入自定义类 错误内容:This inspection detects names that should resolve but don't. Due to dynamic dis ...
 - Memcached服务器上实现多个实例(约约问题排查)
			
约约测试服上出行一个问题,司机收车失败. (1)经查看代码是null指针异常. 针对,之前,同套代码发布到华威测试服,未出现该问题,遂认定不是代码问题. (2)打印异常信息,获取null值异常的收车司 ...
 - Spring入门学习笔记(2)——基于Java的配置
			
目录 基于Java的配置 @Configuration & @Bean Annotations Example 注入Bean依赖 @Import注解 Lifecycle Callbacks(声 ...
 - Apache 性能配置优化
			
前言 最近在进行apache性能优化设置.在修改apache配置)文件之前需要备份原有的配置文件夹conf,这是网站架设的好习惯.以下的apache配置调优均是在red had的环境下进行的. htt ...
 - python3去除字符串中括号及括号里面的内容
			
a = """ <option value="search-alias=arts-crafts-intl-ship">Arts & ...