博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态构造函数!
阅读量:6575 次
发布时间:2019-06-24

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

入职第一天,无聊死了,装了VS2013,再装VS2015,然后是SQL2008,再接着是SQL2012,然后就是各种工作常用软件:QQ啦,WeChat啦,Office啦 等等吧,总之:装的东西所废的时间足以让你怀疑人生...

~此篇博客是鄙人抄袭的,如有雷同,纯属巧合!

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

  

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

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

       上面几个特点都是理论性的,我们来做一个找错题,帮助我们一起来学习静态构造函数。

public class C    {        public static string BB;        public static C()        {            BB = "CC";        }        public static C(string mm)        {            BB = mm;        }        static C()        {            BB = "Right";        }        public C()        {            BB = "Wrong";        }        public C(string mm)        {            BB = mm;        }    }

VS编译提示的错误信息:

现在我们来做一个有意思的事情,验证静态构造函数的调用时机:

class Program    {        static void Main(string[] args)        {            Console.WriteLine(A.strText);            Console.WriteLine(B.strText);            Console.Read();        }    }    public class A    {        public static string strText;        public string Text;        static A()        {            strText = "AAA";        }        public A()        {            Text = "AAAAAAAAAAAAAAAAAAAAAAAAAA";        }    }    public class B:A    {        static B()        {            strText = "BBB";        }        public B()        {            Text = "BBBBBBBBBBBBBBBBB";        }    }

输出结果均为:AAA

我们来分析一下出现这个情况的原因所在,当显示A.strText的时候,因为strText是静态变量,所以框架会调用A的静态构造函数,此时strText的值为AAA.正确

当显示B.strText的时候,因为B继承自A,所以会首先调用A的静态构造函数,但是因为静态构造函数只会调用一次,所以不会调用A的静态构造函数,但是又因为strText属于类A,而不是B,所以B得静态构造函数不会执行,故输出的均为AAA。

但是如果我们把输出更改一下,输出结果就大不一样了。

class Program    {        static void Main(string[] args)        {            B b = new B();            A a = new A();            Console.WriteLine(A.strText);            Console.WriteLine(B.strText);                      Console.Read();        }    }    public class A    {        public static string strText;        public string Text;        static A()        {            strText = "AAA";        }        public A()        {            Text = "AAAAAAAAAAAAAAAAAAAAAAAAAA";        }    }    public class B:A    {        static B()        {            strText = "BBB";        }        public B()        {            Text = "BBBBBBBBBBBBBBBBB";        }    }

请注意我在开始部分对类进行了实例化,那么此时的输出结果就是均为BBB。

为什么会有这样的情况出现呢,其实还是要从静态构造函数的调用时机入手。

首先我们实例化了B,此时会调用B的静态构造函数,但是因为strText是A的静态变量,所以首先会先调用A的静态构造函数将strText赋值为AAA,此时又会调用B的静态构造函数将strText赋值为BBB,所以此时strText的值应该为BBB,所以输出均为BBB。

@陈卧龙的博客

你可能感兴趣的文章
C#动态代理
查看>>
使用 sessionStorage 创建一个本地存储的 name/value
查看>>
POJ2127 LICS模板
查看>>
Python笔记8----DataFrame(二维)
查看>>
JavaScript 特殊效果代码
查看>>
【?】codeforces721E Road to Home(DP+单调队列)
查看>>
MySQL 仅保留7天、一个月数据
查看>>
OGG 11g Checkpoint 详解
查看>>
PHP中使用socket通信响应速度慢的原因与解决办法
查看>>
Win7下安装Mysql(解压缩版)
查看>>
UVA 11992 Fast Matrix Operations (降维)
查看>>
Asp.net core Identity + identity server + angular 学习笔记 (第一篇)
查看>>
暂时不想读研的几点理由
查看>>
增加临时表空间组Oracle11g单实例
查看>>
Diff Two Arrays
查看>>
stark组件(1):动态生成URL
查看>>
169. Majority Element
查看>>
下拉菜单
查看>>
[清华集训2014]玛里苟斯
查看>>
Doctype作用?严格模式与混杂模式如何区分?它们有何意义
查看>>