最近,看到一道面试题,如下

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 构造函数的认识的更多相关文章

  1. static 类也可以有static构造函数

    public static class A { static A() { } } static构造函数不能是public,也不可能被主动调用,所以public没有意义

  2. .NET多线程之线程安全,Lock(锁)、Monitor(同步访问)、LazyInitializer(延迟初始化)、Interlocked(原子操作)、static(静态)构造函数、volatile、

    1.什么是线程安全 线程安全是编程中的术语,指某个函数.函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成.一般来说,线程安全的函数应该为每个调用它的线程分配专门的 ...

  3. C#基础知识系列七(base、this、new、override、abstract、virtual、static)

    前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...

  4. const,readonly,static

    1.const 表示的是常量(constant),始终不会发生改变,在编译时就确定了.所以类中定义一个常量可以被类访问也可以被类的实例访问.定义时就不能和static一起用.如果用了也是没有作用的,所 ...

  5. C# static成员的构造顺序

    熟知的几个原则 1.static字段初始化先于static构造函数 2.static字段按顺序初始化 3.static字段和static构造函数只执行一次 public class Foo { pub ...

  6. 【C#基础知识】静态构造函数,来源于一道面试题的理解

    看到园友的一道面试题,很好奇,测试了一下结果. public class A { public static int X=B.Y ; public A() { ++X; } } public clas ...

  7. C#基础知识(base、this、new、override、abstract、virtual、static)

    前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...

  8. base、this、new、override、abstract、virtual、static

    前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...

  9. Static 用法

    1.Static关键字含意:static译文是静态的,静止的,因此使用 static 修饰符声明属于类型本身而不是属于特定对象(new创建的对象)的静态成员. 2.修饰使用范围 static 修饰符可 ...

随机推荐

  1. java 中AIO,BIO,NIO的区别(茅塞顿开)

    看到知乎上一篇回答,解决了疑惑:https://www.zhihu.com/question/56673416 第三位作者的回答...原谅我没有登录知乎,不然一定给他留赞. 也可以参考:https:/ ...

  2. Delphi Qjson

    使用QJSON解析数据: JSon 字符串: {"Code":1,"Msg":"", "Data":[{"Ne ...

  3. android 环境变量

    1.新建一个环境变量和系统变量名称为ANDROID_HOME,变量值为当前安装SDK的目录 2.把%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools添 ...

  4. UGUI的text赋值问题-速度

    仅是简单的给一个ugui.text组件不断的赋值字符串,就会带来很高的CPU消耗,约0.5MS左右. 这个过程主要是消耗在字体的MESH顶点重建. 在游戏中变化的字体一般不多,聊天面板虽然变化,刷新率 ...

  5. Extjs4 自定义颜色选择器ColorField

    使用元素的颜色选择器 Ext.create("Ext.picker.Color",{ renderTo:Ext.getBody(), listeners:{ select:func ...

  6. HTML 样式兼容不同设备类型

    在项目中遇到在屏幕上显示的效果和打印时显示的效果不同,可以使用media属性来指定用于不同的媒介时使用的样式. media属性值: 值 描述 screen 计算机屏幕显示(默认) tty 电传打字机以 ...

  7. KVM虚拟化技术(六)磁盘管理

    KVM支持的虚拟磁盘类型 raw 这并非是一种真正的磁盘格式,而是代表虚拟机所使用的原始镜像:它并不存储元数据,因此可以作为保证虚拟机兼容性的候选方案,然而也正因为 它不存储元数据,因此不能支持某些高 ...

  8. ajax跨域名

    跨域环境模拟: 修改host文件 三种解决的方案 1:ifram(display:none) 2:jsonp(注意是只是适合的是get请求) 生成一个带有src的script标签, 3:cros(后台 ...

  9. python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)

     -*-          paramiko.util.log_to_file(         ssh = paramiko.SSHClient()          ssh.set_missing ...

  10. C# HttpWebRequest 模拟下载

    C# web 获取服务端cookie 原文地址:https://www.cnblogs.com/louby/p/5569536.html C#多线程环境下调用 HttpWebRequest 并发连接限 ...