博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】关于C#静态构造函数的几点说明
阅读量:6768 次
发布时间:2019-06-26

本文共 1690 字,大约阅读时间需要 5 分钟。

一、定义

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

class SimpleClass{// Static constructorstatic SimpleClass()    {//    }}

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

  1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
  2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
  3、一个类只能有一个静态构造函数。
  4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
  5、最多只运行一次。
  6、静态构造函数不可以被继承。
  7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。

      8、线程安全

      关于线程安全需要特别说明一下,由于程序可能在多线程环境下运行,也就是可能出现同时多个线程准备执行静态构造函数的情况。CLR确保这个过程是安全的,实际上调用静态构造函数的线程需要先获得一个互斥线程同步锁,如果有多个线程试图执行类型的静态构造函数,只有一个线程能获得该锁;获得锁的线程完成初始类型初始化操作,其它线程只能等待;当初始化完成,等待的线程被唤醒,然后发现静态构造函数已经被执行过,就不会再执行。

二、作用

  用于初始化静态成员。有时候我们会从配置文件读取一些值作为静态变量,类似这样:  

public class StaticTester{private static readonly string key = ConfigurationManager.AppSettings["key"];private static readonly string value = ConfigurationManager.AppSettings["value"];static StaticTester(){           }}
  如果要读取的配置信息比较多,而且要加入一些逻辑判断,那么可以这样:  
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. 其它操作。

 

【转自】

          

转载于:https://www.cnblogs.com/bad-man/p/7953517.html

你可能感兴趣的文章
Linux查看CPU和内存使用情况
查看>>
css笔记二
查看>>
数组数据的排序sort
查看>>
如何更新你的电脑到win10 1903版本?
查看>>
xml 基础 学习
查看>>
python 模块
查看>>
20165306学习基础和C语言基础调查
查看>>
Android通过手势实现图像拖拽功能
查看>>
没有killall命令的解决方法
查看>>
Flask权限管理
查看>>
企业可视化报表工具选型经验分享
查看>>
长春理工大学第十四届程序设计竞赛(重现赛)F.Successione di Fixoracci
查看>>
牛客假日团队赛2 H.奶牛排序
查看>>
激活函数——sigmoid函数(理解)
查看>>
php ucwords 单词的首字母大写
查看>>
【爬虫】python 多线程知识
查看>>
由Cocos2dx的部分代码引出的对Lua元表的认识
查看>>
Spring Cloud构建微服务架构--服务网关
查看>>
hello oracle II
查看>>
vue2.0 仿手机新闻站(三)通过 vuex 进行状态管理
查看>>