static 构造函数的认识
最近,看到一道面试题,如下
class Class1
{
private static int count = ;
static Class1()
{
count++;
}
public Class1()
{
count++;
}
} Class1 one = new Class1();
Class1 two = new Class1();
问程序执行完成以后,Class1.Count的值是多少。很显然,考查的是对static关键字的基本认识,答案是3。
从程序的执行顺序来说,第一次实例化类Class1时,先走静态构造函数==>普通无参构造函数,第一次实例化Class1后,count的值为2。
第二次实例化类Class1时,不会执行静态构造函数,直接走无参构造函数,执行完后,count的值变为3.
如果此题答案正确,那么请看下面的考题
class A
{
public static int X = B.Y;
static A()
{
X++;
}
} class B
{
public static int Y=A.X;
static B()
{
Y++;
}
}
请问 A.X=? B.Y=?
A.X表示此时开始访问A类,执行X=B.Y(此时先给其分配空间,并辅以0来初始化,然后调用对应的成员初始化语句来初始化这个静态成员);
B.Y表示开始访问B类,执行Y=A.X(此时不是第一次访问类型A,所以不再进行静态成员初始化和静态构造函数的调用),此时,系统默认A.X=0; 既然访问B类,就会执行B类的静态构造函数,B类的构造函数执行完毕,此时Y=1,
static int X=1,然后执行A类的静态构造函数,执行完毕后,X=2,因此A.X=2。
B.Y开始实例化B类。 但是B类的静态字段与静态构造函数已经执行了一次,不会再执行第二次A.X执行完毕后,Y已经等于1,因此B.Y=1。
因此,可以了解到静态字段以及静态构造函在类被实例化时的一些特殊点:
1、静态字段先于静态构造函数被初始化,静态构造函数在一个类中只有一个且不能带有参数;
2、静态成员初始化语句与静态构造函数在指定的程序域中只会被执行一次,不论这个类被实例化多少次;
3、对于存在多个static成员,他们的初始化将按照文本顺序进行,不会因为调用顺序而改变。
那么,静态构造函数什么时候会被首次触发呢?
1、该类的实例被创建;
2、任何一个static成员被引用。
class Class1
{
private static Class1 obj = new Class1();
public static int counter1;
public static int counter2 = ;
private Class1()
{
counter1++;
counter2++;
}
public static Class1 getInstance()
{
return obj;
} [STAThread]
static void Main(string[] args)
{
Class1 obj = Class1.getInstance();
Console.WriteLine("Class1.counter1=="+Class1.counter1);
Console.WriteLine("Class1.counter2=="+Class1.counter2);
Console.Read();
}
}
Design&Pattern 的 Singleton Pattern 的时候,因为静态初始化是在 .NET 中实现 Singleton 的首选方法。
static 构造函数的认识的更多相关文章
- static 类也可以有static构造函数
		public static class A { static A() { } } static构造函数不能是public,也不可能被主动调用,所以public没有意义 
- .NET多线程之线程安全,Lock(锁)、Monitor(同步访问)、LazyInitializer(延迟初始化)、Interlocked(原子操作)、static(静态)构造函数、volatile、
		1.什么是线程安全 线程安全是编程中的术语,指某个函数.函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成.一般来说,线程安全的函数应该为每个调用它的线程分配专门的 ... 
- C#基础知识系列七(base、this、new、override、abstract、virtual、static)
		前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ... 
- const,readonly,static
		1.const 表示的是常量(constant),始终不会发生改变,在编译时就确定了.所以类中定义一个常量可以被类访问也可以被类的实例访问.定义时就不能和static一起用.如果用了也是没有作用的,所 ... 
- C# static成员的构造顺序
		熟知的几个原则 1.static字段初始化先于static构造函数 2.static字段按顺序初始化 3.static字段和static构造函数只执行一次 public class Foo { pub ... 
- 【C#基础知识】静态构造函数,来源于一道面试题的理解
		看到园友的一道面试题,很好奇,测试了一下结果. public class A { public static int X=B.Y ; public A() { ++X; } } public clas ... 
- C#基础知识(base、this、new、override、abstract、virtual、static)
		前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ... 
- base、this、new、override、abstract、virtual、static
		前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ... 
- Static 用法
		1.Static关键字含意:static译文是静态的,静止的,因此使用 static 修饰符声明属于类型本身而不是属于特定对象(new创建的对象)的静态成员. 2.修饰使用范围 static 修饰符可 ... 
随机推荐
- Java 配置环境变量教程
			[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ... 
- Mac打开swf文件
			在网上搜怎么打开swf文件,找到一个简易的方法, 在文本编辑器里输入以下内容,保存成html格式,直接在浏览器打开 <html> <body> <embed src=&q ... 
- Ubuntu下的LNMP环境
			保证联网的情况下,直接参照http://lnmp.org/install.html进行安装,以下花括号内为原文引用: { 1.使用putty或类似的SSH工具登陆VPS或服务器: 登陆后运行:scre ... 
- LINUX系统一一CentOS6.5之tomcat安装
			一 准备工作建立好文件夹 tomcat文件夹地址 二 下载并解压 当然是下载了 1.centos6.5系统里面下载 解压 2.本机下载 然后利用Xftp复制到目标文件加载解压(我用的是这种,随意啦) ... 
- vue-cli结构介绍
			vue-cli是vue项目开发的脚手架,非常方便,其结构大致如下, 其中static是存放静态资源的,存放的静态数据可以访问到,如果在static文件夹中创建mock文件夹,在mock文件夹中创建in ... 
- 常用官方php版本下载链接
			windows 版本 https://windows.php.net/downloads/releases/archives/ https://windows.php.net/download/#ph ... 
- ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
			原文链接:https://www.cnblogs.com/kaid/p/8616385.html 在ubuntu系统的termial下,用apt-get install 安装软件的时候,如果在未完成下 ... 
- Gradle安装和在IDEA使用 基本操作
			阅读目录 简单介绍 安装 使用idea创建一个web的Gradle项目 如何进行打包 解释build.gradle和settings.gradle 有关gradle的jar冲突 本地jar包位置和修改 ... 
- NBU 还原LINUX ORACLE 数据库(EHR)
			一.E-HR数据库(全备)恢复 目录 一.E-HR数据库(全备)恢复... 1 1. 使用bplist 命令读取备份文件... 1 2. 启动到nomount状态... 2 3. 利用rman还原控制 ... 
- Appium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks
			问题: 使用Apppium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks 我的启动配置如下 { ... 
