谈谈C#中类成员的执行顺序.
今天我们来谈谈C#中子类和父类中静态成员以及构造函数的执行顺序,这个地方向来是初学C#的人比较迷惑的地方,也是各大公司最喜欢拿来出面试题的地方。
下面我们分情况来分析。
1. 普通构造函数和静态构造函数的执行顺序。
对于单个的类,它的静态构造函数将先于普通构造函数执行,因为普通构造函数需要在实例化该类的时候执行,而静态构造函数访问该类的同时就开始执行。
而对于有继承关系的父类和子类来说,父类的普通构造函数先于子类的普通构造函数执行,简而言之就是被依赖的先构造,依赖于人的后构造。
我们来看实例。
我们为父类和子类分别定义静态构造函数和普通构造函数。
{
static Parent()
{
Console.WriteLine("Parent Static Constructor");
}
public Parent()
{
Console.WriteLine("Parent Constructor")
}
}
定义一个子类继承于该父类。
{
static Child()
{
Console.WriteLine("Child Static Constructor");
}
public Child()
{
Console.WriteLine("Child Constructor");
}
}
那么当我们实例化Child类的时候会如何输出呢?
{
Child child = new Child();
Console.Read();
}
结果如下
这个结果很好解释,我们实例化子类,所以静态构造函数在访问类的时候同时访问,所以先执行子类的静态构造函数,而Child类依赖于Parent类,所以接下来执行Parent类的普通构造函数。
两个类的静态构造函数执行完毕后分别执行父类的普通构造函数和子类的普通构造函数。
2. 静态变量,静态构造函数以及普通构造函数的情况。
从上面分析的第一种情况我们知道静态构造函数是先于普通构造函数执行的, 而静态变量是先于静态构造函数执行的。
那如果该静态变量定义的是该类的一个实例执行顺序如何呢?
我们来看实例。
{
static public Child instance = new Child();
static Child()
{
Console.WriteLine("Child Static Constructor");
}
public Child()
{
Console.WriteLine("Child Constructor");
}
}
实例化该类,显示结果如下:
对于这个执行结果,首先执行的是静态变量,而该静态变量是对Child类的实例化,此时先调用它的普通构造函数,为什么不会调用它的静态构造函数呢?因为静态构造函数的执行在静态变量之后,
所以第一步,初始化静态变量,打印 "Child Constructor" ;
第二步,执行静态构造函数,打印 "Child Static Constructor" ;
第三步,执行普通构造函数, 打印 "Child Constructor".
3. 存在继承关系的静态变量,静态构造函数,普通构造函数的执行顺序.
下面我们把第二种情况复杂化一点,加入父类。
{
static Parent()
{
Console.WriteLine("Parent Static Constructor");
}
public Parent()
{
Console.WriteLine("Parent Constructor");
}
}
子类继承于父类。
{
static public Child instance = new Child();
static Child()
{
Console.WriteLine("Child Static Constructor");
}
public Child()
{
Console.WriteLine("Child Constructor");
}
}
如果我们实例化Child类,会产生什么结果呢?在我给出答案之前,大家不妨先分析一下这个结果。
1. 先初始化Child类的静态变量instance。
显然最开始执行的是Child类中的静态变量instance,instance要实例化一个Child类,那么首先要访问Child类的普通构造函数,而Child类又是依赖于Parent类的,所以在执行Child类的
构造函数之前,先执行的是它父类的静态构造函数和普通构造函数(注意此时Child类的静态构造函数不会执行)。它将打印出"Parent Static Constructor"和"Parent Constructor".
其次执行这个普通构造函数,(此时Child类的静态构造函数仍然不会执行)。打印出"Child Constructor".
2. 执行Child类的静态构造函数
这次将打印出"Child Static Constructor"。
3. 执行Child类的普通构造函数
执行Child类的普通构造函数,这里会产生两个结果。首先,会执行它父类的普通构造函数,注意此时父类的静态构造函数不会执行了,它只会执行一次。其次才是执行Child类自己的普通构造函数。
因此此时应该打印出"Parent Constructor"和"Child Constructor".
实际运行的结果也证明刚才分析的正确性。
通过上面三个例子的分析,相信大家应该知道了如何去分析这个执行顺序,那就给大家留一个作业自己思考吧。
父类:
{
static public Parent instance = new Parent();
static Parent()
{
Console.WriteLine("Parent Static Constructor");
}
public Parent()
{
Console.WriteLine("Parent Constructor");
}
}
子类:
{
static public Child instance = new Child();
static Child()
{
Console.WriteLine("Child Static Constructor");
}
public Child()
{
Console.WriteLine("Child Constructor");
}
}
}
http://www.cnblogs.com/ustbwuyi/archive/2011/03/25/1994989.html
转载于:https://blog.51cto.com/flydragon0815/669761
相关文章:
AI 重塑 IT的 5 种方式
作者 | Stephanie Overby译者 | 火火酱,责编 | Carol封图 | CSDN 下载于视觉中国Gartner最新的人工智能(AI)hype cycle报告指出,AI在未来五年中CIO议程中的排名十分靠前,对潜在业务转型具有重要影响。然而,…

[原创]Gerrit中文乱码问题解决方案分享
应开发同事的要求,部署了GitlabGerritJenkins的持续集成环境. 但是发现了一个问题,Gerrit登陆后有中文乱码出现. 具体情况如下: (1)Git代码中的中文乱码处理: 为妥善解决中文编码的问题,对所有git repository做如下约定:所有文本文件都必须存储成utf8编码…

UVA 10700 Camel trading
UVA_10700我们可以猜到最大值一定是先算和后算积,最小值一定是先算积后算和,因为a*bc<a*(bc)。此外,这个题目数据有可能比较大,所以要采用long long int或者double来处理数据。 #include<stdio.h>#include<string.h>#include&…

在ASP.NET中操作文件的例子
利用SYSTEM.IO 名空间中的STREAMWRITER,STREAMREADER及FILE类,完成文件读、写、删除的操作。 -------------------------------------------------------------------------------- 1、写文件 writefile.aspx <% Import Namespace"System.IO" %> 引…
云原生如此重要,可惜80%的人都不知道
文 | Aholiab责编 | Carol封图 | CSDN 下载自视觉中国2020年,一场疫情给中国企业带来了一次「被动数字化升级」,很多企业第一次认识到了信息化的重要性。今天,数字经济已无处不在,根据中国信息化百人会的研究报告显示,…

CentOS 7 yum 安装 MySQL5.7
为什么80%的码农都做不了架构师?>>> 0、环境 本文操作系统: CentOS 7.2.1511 x86_64 MySQL 版本: 5.7.13 1、下载 MySQL 官方的 Yum Repository 从 MySQL 官网选取合适的 MySQL 版本,获取下载地址。 然后使用 wget 下载: [rootce…
万字长文带你入门 GCN
来源 | 阿泽的学习笔记(ID: aze_learning)Convolutional Neural NetworkCNN 在图像识别等任务中具有重要作用,主要是因为 CNN 利用了图片在其域中的平移不变性。由于图结构不存在平移不变性,所以 CNN 无法直接在图上进行卷积。1.1…

VS.Net中程序集的Debug版本和Release版本的区别
作者:未知 请作者速与本人联系前几天看到豆腐的文章介绍如何知道程序集是Debug版还是Release版,之前只知道某些软件从功能上有企业版、标准版之分,却从不知道.Net程序集还有Debug和Release之区别,真是惭愧学了这一年C#。然后在博…

《CLR via C#》笔记——CLR的执行模型
一.将源代码编译成托管代码1, CLR(Common Language Runtime)公共语言运行时是一个可由多种语言使用的“运行时”,CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理…

telnet时显示:允许更多到 telnet 服务器的连接。请稍候再试
telnet时显示:允许更多到 telnet 服务器的连接。请稍候再试 解决办法:windows自带telnet服务器默认的最大连接数为2,要想修改该设置,可以在命令行键入tlntadmn config maxconn要设置的连接数。最大连接数是指同一时刻内客户连接服务器的最大数…

Asp.net支持的最大上传文件大小
Asp.net的默认的最大可以上载的文件是4M,可以在web.config中配置.配置 ASP.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。 <configuration> <system.web> <httpRuntime><httpRuntime useFullyQualifiedRedirectUrl&q…

ASP.NET--Menu控件
http://www.meituan.com/r/i13110281 Menu控件提供静态和动态混合的菜单功能。在向页面添加这个控件的时候,开发人员可以选择将它设置为一个完全动态的菜单,以便整个站点的导航结构都可以显示在菜单中,类似于Windows的Start菜单。另一种选择是…

AI进军服装零售产业:微软小冰与特步推出定制化服装设计生产及零售平台
(6月22日,北京) 今日,体育用品企业特步集团与微软小冰宣布达成合作,依托微软小冰人工智能创造技术共同推出的定制化服装设计生产及零售平台即将上线。双方携手为消费者提供定制化图案设计,满足每个消费者的…

PHP如何通过Http Post请求发送Json对象数据?
因项目的需要,PHP调用第三方 Java/.Net 写好的 Restful Api,其中有些接口,需要 在发送 POST 请求时,传入对象。 Http中传输对象,最好的表现形式莫过于JSON字符串了,但是作为参数的接收方,又是需…

字符串截取固定长度的方法
这个函数也没有什么特别之处,就是可以截取一定长度的字符串,可能小特点就是len是字节,解决了汉字与英文字节不一样导致直接截取到的长度不一样的问题, #region 字符串截取函数 public static string CutString(string inputStrin…

hql中常用函數介紹二
为什么80%的码农都做不了架构师?>>> 四. ISNULL 函数和 NULLIF 函数SQL Server里的 ISNULL 与 ASP 中的 IsNull不同,SQL Server 中有两个参数,语法: ISNULL(check_expression, replacement_value) check_expression 与…
技术直播:讲一个Python编写监控程序的小故事
今年疫情“黑天鹅”事件改变了大家的生活。相信大家都经历过,每天早晨起床第一件事,就是查看数据。这些数据不仅仅是人们对活着的渴望,也是在建立对战胜疫情的决心。那么技术人怎么能通过自己所学的去进行数据监控呢?今天CSDN邀请…

ios开发之系统信息
1. //手机系统版本 self.phoneVersion [NSString stringWithFormat:"iOS %",[[UIDevice currentDevice] systemVersion]]; 2. // 获取当前设备可用内存(单位:MB) - (double)availableMemory { vm_statistics_data_t vmStats; mach_msg_type_n…
混合时空图卷积网络:利用导航数据改进交通预测效果 | KDD 2020
作者 | 高德机器学习团队出品 | AI科技大本营(ID:rgznai100)引言时空预测(spatio-temporal forecasting)在天气预报、运输规划等领域有着重要的应用价值。交通预测作为一种典型的时空预测问题,具有较高的挑战性。日常通…

MS SQL Server和MySQL区别
- 最近在做MS SQL Server转换成MySQL的工作,总结了点经验,跟大家分享一下。同时这些也会在不断更新。也希望大家补充。 1 MySQL支持enum,和set类型,SQL Server不支持 2 MySQL不支持nchar,nvarchar,ntext类型 3 MySQL的递增语句是AUTO_INC…

DataGrid在分页状态下删除纪录的问题
在使用DataGrid分页的时候,正常情况下,绑定数据库列表纪录时会自动产生分页的效果,然而我发觉在删除纪录的时候总会发生"无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount。"的异常,其实解决这个问题很简…

thinkphp pathinfo nginx 无法加载模块:Index
thinkphp 报了 无法加载模块:Index 错误位置 FILE: /var/multrix/wxactivity_archive/ThinkPHP/Library/Think/Dispatcher.class.php LINE: 177 这个错,刚开始以为是路由错了,还跟了一下代码,始终没有答案,弄了一上午࿰…

Linux普通用户启动tomcat
修改tomcat/bin/catalina.sh文件,加入 export JRE_HOME/usr/java/jre1.6.0_27 ------------------------------------------------------ #!/bin/sh # chkconfig: 2345 80 30# description: tomcat starup scriptCATALINA_HOME/usr/local/apache-tomcat-7.0.21su - …

ASP.NET中利用cookies保持客户端信息
作者:未知 请作者速与本人联系我当前所吃的东东都固定为食物,所以一点也不惊讶,这一周的主题为cookies。Cookies用于存储特定用户信息,它提供了Web程序中一种有用的方式。多年以来,JavaScript开发人员已经进行了有关…
中国自动驾驶技术有多强?你可能还不知道
随着大数据、互联网、5G等技术在汽车领域的不断普及和推广,自动驾驶技术也开始为人们熟知。无论是新能源汽车还是传统汽车,自动驾驶都是业界未来需要抢占的制高点,越来越多的企业在自动驾驶领域开始发力。随着无人驾驶汽车相关法律法规的放宽…

UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算
复杂的数据结构和计算不是 bash 的特长。但它的确至少提供了数组和算术运算。 1.算术运算 所有的 bash 变量的值都是字符串,所以 bash 在赋值的时候并不区分数字 1 和 字符串 "1" 。不同之处在于如何使用变量。下面几行代码展示出了其中的差异:…

文件上传的实现(C#)
文件上传一. 在Form中一定要将encType设为"multipart/form-data":<form id"WebForm3" method"post" encType"multipart/form-data" runat"server" >二. 判断是否有文件上传了:当用户没有选…

C#编程应用--线程与委托
1. C#开发C/S程序,有时需要几个端,如服务器端,管理端,客户端等等, 端与端之间是不同线程或者进程,这就涉及跨线程调用的问题,使用委托或者异步线程是必不可少的,这里是一个简单的委托…
深度整合英特尔傲腾,SmartX首发100us级超低延迟超融合解决方案
6 月 17 日,致力于超融合中高端市场的SmartX公司正式发布基于核心软件 SMTX OS 与英特尔 傲腾™ 持久内存的高性能、低延迟超融合解决方案与SmartX Halo P系列一体机。 SmartX 在业内首次将英特尔傲腾持久内存以App Direct Mode (应用直接访问模式&…

caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
经过前面两篇博文的学习,我们已经训练好了一个caffemodel模型,并生成了一个deploy.prototxt文件,现在我们就利用这两个文件来对一个新的图片进行分类预测。 我们从mnist数据集的test集中随便找一张图片,用来进行实验。 #codingutf…