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 修饰符可 ...
随机推荐
- Slava and tanks 877C
C. Slava and tanks time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- UNITY2018 真机开启deepprofiling的操作
手机上运行游戏并开启deepprofiling的命令如下 命令一:adb shell am start -n com.szyh.YHP1.kaopu/com.szyh.YHP1.kaopu.MainA ...
- mysql网课部分笔记
mysql> \s 查看当前数据库的状态 \c 取消当前所输入的命令或字符 ------------------------------------------------------- m ...
- python学习笔记之斐波拉契数列学习
著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 如果用Python的列表生成式, ...
- C++ new 和malloc 区别
1.分配地方不同,malloc是堆上面,new是自由存储区域 2.malloc/delete是函数,new/delete是操作符,可以重载 3.malloc 要指定大小,返回的是void*指针,开辟的 ...
- 使用arguments对象验证函数的参数是否合法
<script>function sum(arg1,arg2) //加法函数{ var realArgCount = arguments.length; //调用函数时传递的实参个数 va ...
- TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add(转)
1. tf.add(a, b) 与 a+b 在神经网络前向传播的过程中,经常可见如下两种形式的代码: tf.add(tf.matmul(x, w), b) tf.matmul(x, w) + b 简而 ...
- k8s 创建deployment流程
pod 创建流程https://blog.csdn.net/yan234280533/article/details/72567261 api server -> etcd -> cont ...
- Appium appium 安装不了
npm --registry http://registry.cnpmjs.org install -g appium使用npm的国内镜像可以安装,速度很不错.以后不想输入ip的话可以输入以下命令:n ...
- SpringBoot SpringSession redis SESSION
号称无缝整合httpsession 共享, 但注意如果存在第三方框架,例如SESSION并发控制,这个是需要自己重写session名单的. 关于redis session 共享 的session并发控 ...