静态构造函数c# 静态块java initallize oc
静态构造函数c# 静态块java initallize oc
先看一道常见题目,以下代码的执行结果是什么?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class A{ public static int X = B.Y + 1; static void Main(string[] args) { Console.WriteLine(X); }}class B{ public static int Z = 10; public static int Y; static B() { Console.WriteLine(Z); Y = A.X + 1; }} |
一、定义
由名称可知,静态构造函数(也称为类型构造函数)包含“静态”和“构造函数”两个特点。第一个特点决定了它与静态函数类似,只能使用静态成员;第二个特点决定了它与构造函数类似,具有初始化作用,并且没有返回值。
与构造函数(针对实例对象)不同的是,静态构造函数(针对类)只执行一次,并且是在第一个实例对象创建前被调用,所以它可以用于那些只需要执行一次的操作;而且它不允许有public等修饰符,由程序自动调用,不能被外界调用。
总结:静态构造函数用于初始化任何静态数据,或者用于执行仅需执行一次的操作;在创建第一个实例对象或者引用任何静态变量之前,将自动调用静态构造函数。
特点:
1、静态构造函数既没有访问修饰符,也没有参数。
2、在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
3、无法直接调用静态构造函数。
4、在程序中,用户无法控制何时执行静态构造函数。
5、线程安全。
关于线程安全需要特别说明一下,由于程序可能在多线程环境下运行,也就是可能出现同时多个线程准备执行静态构造函数的情况。CLR确保这个过程是安全的,实际上调用静态构造函数的线程需要先获得一个互斥线程同步锁,如果有多个线程试图执行类型的静态构造函数,只有一个线程能获得该锁;获得锁的线程完成初始类型初始化操作,其它线程只能等待;当初始化完成,等待的线程被唤醒,然后发现静态构造函数已经被执行过,就不会再执行。
二、语法
|
1
2
3
4
5
6
|
public class StaticTester{ static StaticTester() { }} |
三、作用
用于初始化静态成员。有时候我们会从配置文件读取一些值作为静态变量,类似这样:
|
1
2
3
4
5
6
7
8
9
|
public class StaticTester{ private static readonly string key = ConfigurationManager.AppSettings["key"]; private static readonly string value = ConfigurationManager.AppSettings["value"]; static StaticTester() { }} |
如果要读取的配置信息比较多,而且要加入一些逻辑判断,那么可以这样:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class StaticTester{ private static readonly string key; private static readonly string value; static StaticTester() { key = ConfigurationManager.AppSettings["key"]; if (string.IsNullOrEmpty(key)) { throw new Exception("key变量未被正确配置!"); } value = ConfigurationManager.AppSettings["value"]; if (string.IsNullOrEmpty(value)) { throw new Exception("value变量未被正确配置!"); } }} |
四、执行顺序
1. 运行时,优先对静态变量进行初始化。
2. 如果有静态构造函数,那么在创建第一个实例对象或者引用任何静态变量之前,调用静态构造函数。
3. 其它操作。
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态方法
C# static constructor[edit]
In C#, a static constructor is a static data initializer. Static constructors are also called class constructors. Since the actual method generated has the name .cctor they are often also called "cctors".[5][6]
Static constructors allow complex static variable initialization.[7] Static constructors are called implicitly when the class is first accessed. Any call to a class (static or constructor call), triggers the static constructor execution. Static constructors are thread safe and implement a singleton pattern. When used in a generic programmingclass, static constructors are called at every new generic instantiation one per type. Static variables are instantiated as well.
public class MyClass
{
private static int _A; // Normal constructor
static MyClass()
{
_A = 32;
} // Standard default constructor
public MyClass()
{ }
}
静态构造函数c# 静态块java initallize oc的更多相关文章
- 为什么不允许使用 Java 静态构造函数?
不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么. Java 静态构造函数 假设我们有一个定义为的类: pu ...
- java 静态构造函数
在java中貌似是没有静态构造函数的. 不过用下面的方式同样可以实现效果. static { }//end 这是静态代码块
- 关于Java的静态:静态类、静态方法、静态变量、静态块等
原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev 很少看到文章能把静态这个问题解释的很清楚, ...
- java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数
如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test; public class TestClass{ // 成员变量赋值第一个 ...
- 2.java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块
1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中 可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名. ...
- static特别用法【静态导包】——Java包的静态导入
面试我问你static关键字有哪些作用,如果你答出static修饰变量.修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热 ...
- C# 静态构造函数,静态变量执行顺序(精华版)(规正版)
一.成员初始化整体顺序 1.成员赋值初始化先于构造函数: 2.成员赋值初始先从子类再到基类: 3.构造函数初始化先从基类再到子类: 4.静态成员初始化优先于实例成员初始化: 二.对类型静态成员构造的大 ...
- c#静态构造函数 与 构造函数 你是否还记得?
构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧. 静态构造函数是在构造函数方法前面添加了stat ...
- 深入了解C#中的静态变量和静态构造函数
深入的剖析C#中静态变量和静态构造函数: 在日常的程序开发过程经常会使用到静态变量,众所周知,静态变量时常驻内存的变量,它的生命周期是从初始化开始一直到Application结束.但是,我们经常会忽略 ...
随机推荐
- SpringBoot(九) ElasticSearch 全文检索
ElasticSearch ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用 ...
- 多线程与MySQL(十)
1.1 多线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...
- Hibernate配置文件 hibernate.cfg.xml
<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...
- ASP.NET 页面缓存OutputCache用法实例(附ab压力测试对比图)
本文主要介绍Web窗体页面中的使用方法,MVC中使用方法,大家自行百度. 一.简单一行指令即可实现 <%@ OutputCache VaryByParam=" %> 这样整个页面 ...
- TensorFlow+实战Google深度学习框架学习笔记(5)----神经网络训练步骤
一.TensorFlow实战Google深度学习框架学习 1.步骤: 1.定义神经网络的结构和前向传播的输出结果. 2.定义损失函数以及选择反向传播优化的算法. 3.生成会话(session)并且在训 ...
- Docker-镜像的操作命令
2.镜像在Ubuntu中的一些命令 (1)docker image ls 列出镜像 能够罗列出docker中所以的镜像所在的仓库.镜像标签.镜像ID.镜像的创建日期.镜像的大小等等信息. (2)doc ...
- Oracle-Trigger-Insert tableA and tableB
create or replace trigger trg_a after insert ON a for each rowbegin INSERT INTO b values(:NEW.ID,: ...
- 给iview组件select设置默认值
1.首先,给select加一个v-model,如: <Select v-model="exam_name" > <Option v-for="(item ...
- vi 编辑器的日常使用
命令行模式: 光标管理 text 屏幕 行 单词 gg 跳转到文档头部 H 跳转到屏幕首行 ^ 或 数字0 跳转到行首 w 向前 G 跳转到文档尾部 M 跳转到屏幕中行 $ 跳转到行尾 b 向后 ...
- AT1145 ホリドッグ
洛谷的题解区里竟然没有O(1)做法详解-- 题面就是要判断\(1+2+\dots+n\)是不是素数 很容易让人想到上面的式子事实上等于\(n(n+1)/2\) 根据质数的定义,质数只能被1和自身整除 ...