静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。

复制代码 代码如下:

class SimpleClass
{
// Static constructor
static SimpleClass()
{
//
}
}

在使用静态构造函数的时候应该注意几点:

1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。

2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。

3、一个类只能有一个静态构造函数。

4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。

5、最多只运行一次。

6、静态构造函数不可以被继承。

7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。

静态构造函数趣谈!
类的静态构造函数也叫类型构造器,静态构造器,他调用的时刻由CLR来控制:

CLR会选择如下时间之一来调用静态构造函数:
 1,在类型的第一个实例创建之前,或类型的非继承字段或成员第一次访问之前。这里的“之前”,代表前后衔接的意思。这里的时刻是精确的!

2,在非继承的静态字段或成员第一次访问之前的某个时刻,具体时刻不定!

由于调用的时刻不确定,所以我们最好不要编写依赖于特定的静态构造函数的执行顺序的代码,这样很容易产生不可预料的后果!

下面大家看看以下的Demo,我们来更加深入的看看静态构造函数的一些有趣的行为:

Demo1:

复制代码 代码如下:

static void Main(string[] args)
{
Console.WriteLine(B.strText); 
}
public class A
{
public static string strText;
static A()
{
strText = "aaaa"; 
}
}
public class B : A
{
static B()
{
strText = "bbbb";  
}
}

大家猜猜结果是什么,可能有人认为输出的是bbbb,因为访问B.strText需要调用B类的静态构造函数static B()。实际上输出的结果是aaaa,因为strText是类A的静态字段,而类B只是继承了这个字段,所以这里会调用类A的静态构造函数static A(),所以输出结果是aaaa。这也没有什么真正可说的,相信大家都能看出这个结果的。

下面看看第二个Demo:

Demo2:

复制代码 代码如下:

static void Main(string[] args)
{
B b = new B(); 
A a = new A();

Console.WriteLine(B.strText);

}
public class A
{
public static string strText;
static A()
{
strText = "aaaa";  
}
}
public class B : A
{
static B()
{
strText = "bbbb";  
}
}

大家猜猜输出结果是什么,可能有人认为会输出aaaa,理由是new B()之前会调用static B(),然后new A()之前需要调用static A,这样结果是aaaa,但是实际情况并非如果,正确的结果是bbbb,原因如下:

在执行  new B(); 之前,B类的静态构造函数会调用,也就是会调用:
static B()
{
 strText="bbbb";
}

当执行到strText=“bbbb"的时候,这时需要访问strText字段,而B的strText字段是从A类继承的,所以这里需要会先调用:
static A()
{
 strText="aaaa";
}

执行这个函数以后strText的值是aaaa

然后代码又回到static B()中,这时才执行static B()中的strText="bbbb"这行,所以strText这时的值是bbbb

当执行A a=new A();的时候,不会在调用A的静态构造函数了,因为前面已经调用过了,静态函数在整个应用程序域的生命周期中只会调用一次!

c#中的静态构造函数相关推荐

  1. java静态构造函数_为什么不允许使用Java静态构造函数?

    java静态构造函数 Java Static Constructor is not allowed, but why? Before we dig into the reasons for not a ...

  2. C#中静态构造函数的一些理解

    首先,先看一张结论表 If(有类显式静态构造函数) { If(有访问静态成员) { 在进入Main函数之后,第一次访问静态成员之前,先调用静态构造函数,以后将不再调用静态构造函数,同一个静态构造函数最 ...

  3. java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

    如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test;public class TestClass{// 成员变量赋值第一个执行 ...

  4. Effective C# 原则13:用静态构造函数初始化类的静态成员(译)

    Effective C# 原则13:用静态构造函数初始化类的静态成员 Item 13: Initialize Static Class Members with Static Constructors ...

  5. 什么是泛型缓存和静态构造函数?

    泛型:运行原理 1,泛型没有写死类型,调用的时候指定类型,这个是延时声明 2,延时声明,把参数类型的声明推迟到调用, 3,在即时编译中将泛型代码生成了原生代码,根据不同的类型生成不同的副本,等待程序去 ...

  6. C#中static静态变量的用法

    原文:C#中static静态变量的用法 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析 ...

  7. 由单例模式学到:静态构造函数和静态字段

    编译器在编译的时候,会事先分析所需要的静态字段,如果这些静态字段所在的类有静态的构造函数,则忽略静态字段的初始化,否则先进行静态字段的初始化.对类的静态成员初始化的顺序取决于在Main函数中的引用顺序 ...

  8. WIN7 UAC/结构体的Equals方法/C# 开发wince程序,窗口上总留有一块空白区域/静态构造函数...

    1. vs2005在win7下通过IIS7调试时,调用dll失败,但在XP下正常.相信是权限问题,请问应该如何解决?能不能设置dll默认以管理员身分运行? 备注:此DLL已注册成功! 回复引用 全部回 ...

  9. C#构造函数、私有构造函数、静态构造函数与构造函数执行顺序

    https://www.cnblogs.com/ArtofDesign/p/3603986.html 默认构造函数,如果没有为类指定任何构造函数,编译器会自动为类创建一个无参构造函数,用以初始化类的字 ...

最新文章

  1. golang源码分析-调度概述
  2. “我想在 CSDN 写小说” 评论亮了 | 每日趣闻
  3. 每个c语言程序写完后 都要按照,c语言基础学习小结(习题总结)(5页)-原创力文档...
  4. (每天一句python)两个list的交集、并集、差集
  5. 转代码判断邮箱是否合法
  6. Java多线程之线程池的手写改造和拒绝策略
  7. mysql dal_Entity Framework连接Mysql数据库并生成Model和DAL层
  8. unity3d 可视化编程_R编程系列:R中的3D可视化
  9. PostMan 四种常见的 POST 提交数据方式
  10. 楼主,不知道为什么这么流行
  11. graphql java中文文档_GraphQL学习指南 PDF 下载
  12. jQuery EasyUI/TopJUI创建树形表格下拉框
  13. iptables指南
  14. 颠倒Excel数据行顺序
  15. php版工行聚合支付和e支付
  16. 基于python和SQLite的NBA历年MVP变化趋势可视化分析
  17. 反爬与反反爬常见知识点
  18. 一款RS485电表的调试与上位机通讯过程
  19. 基于java的物流信息管理系统(计算机毕业设计)
  20. vue 样式标签使用 scoped

热门文章

  1. python 坐标连线_从具有和角度的坐标绘制线 - python
  2. android rtsp协议转http协议_网络协议HTTP 协议(一)
  3. java inputstream字节流_Java输入输出流ByteArrayInputStream和ByteArrayOutPutStream
  4. js动态渲染html页面,利用Scrapy-Splash抓取JS动态渲染的网页数据
  5. select框怎么传值到服务端_前端简历中的项目经历怎么突出亮点?
  6. 带你1小时掌握Google图像语义分割模型,更有《深度学习》实体书免费送
  7. oracle 查看任务数量,关于dbms_scheduler创建任务数量的疑问
  8. derhams to php,基于laravel belongsTo使用详解
  9. android view getx 0,Android动画:解决通过View.getY()获取初始位置为0的问题
  10. python 文本框_重置Python中的文本框