静态构造函数

一.
静态构造函数用于初始化静态数据,或用来实行仅需进行3次的至极操作。

静态构造函数,java静态构造函数

  1. 静态构造函数用于开始化静态数据,或用来实践仅需试行二遍的新鲜操作。

  2. 静态构造函数既未有访问修饰符,也未尝参数。

三.
在制造第多个实例或引用任罗庆久态成员之前,将自行调用静态构造函数来初阶化类。

  1. 亚洲必赢官网,静态构造函数。无法直接调用静态构造函数。

伍.
万1静态构造函数引发那么些,运转时将不会重新调用该构造函数,并且在程序运转所在的选取程序域的生存期内,类型将维持未开头化。

    class Program
    {
        static void Main(string[] args)
        {
            // 在bus1实例化后调用静态构造函数,只调用一次
            Bus bus1 = new Bus(71);
            Bus bus2 = new Bus(72);
            bus1.Drive();
            System.Threading.Thread.Sleep(3600);
            bus2.Drive();
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    public class Bus
    {
        protected static readonly DateTime globalStartTime;
        protected int RouteNumber { get; set; }
        static Bus ()
        {
            globalStartTime = DateTime.Now;
            Console.WriteLine("static constructor sets global start time to {0}", globalStartTime.ToLongTimeString());
        }
        public Bus (int routeNum)
        {
            RouteNumber = routeNum;
            Console.WriteLine("Bus #{0} is created", RouteNumber);
        }
        public void Drive()
        {
            TimeSpan elapsedTime = DateTime.Now - globalStartTime;
            Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}", this.RouteNumber, elapsedTime.TotalMilliseconds, globalStartTime.ToLongTimeString());
        }
    }

  

一.
静态构造函数用于先导化静态数据,或用来施行仅需执行1遍的例外操作。 2.
静态构造函数既未有访问…

  先看一道常见题目,以下代码的施行结果是哪些?

亚洲必赢官网 1

2.
静态构造函数既未有访问修饰符,也尚未参数。

    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;
        }
    }

 

先看一道常见标题,以下代码的实行理并了结果是如何?

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;
    }
}

一、定义

  由名称可见,静态构造函数(也称为类型构造函数)包涵“静态”和“构造函数”八个特点。第二个特点决定了它与静态函数类似,只好选拔静态成员;第3个特色决定了它与构造函数类似,具备早先化作用,并且未有重临值。

  与构造函数(针对实例对象)分化的是,静态构造函数(针对类)只进行三次,并且是在率先个实例对象创设前被调用,所以它能够用于那一个只供给执行1遍的操作;而且它不容许有public等修饰符,由程序自动调用,无法被外界调用。

  总结:静态构造函数用于起头化任张珈铭态数据,大概用于推行仅需进行1次的操作;在开创第3个实例对象只怕引用任赵琦态变量在此之前,将机关调用静态构造函数。

  特点:

  一、静态构造函数既未有访问修饰符,也未曾子舆数。

  2、在创制第1个实例或引用任任凯态成员从前,将电动调用静态构造函数来起先化类。

  三、无法直接调用静态构造函数。  

  肆、在先后中,用户不能够调控哪天实施静态构造函数。

  5、线程安全。

  关于线程安全供给特地说Bellamy(Bellamy)下,由于程序只怕在多线程境况下运营,也正是唯恐出现同时四个线程准备实行静态构造函数的状态。CL君越确定保障那些进程是安全的,实际上调用静态构造函数的线程要求先得到2个互斥线程同步锁,假如有多少个线程试图施行项目的静态构造函数,只有3个线程能赢得该锁;获得锁的线程完结开首类型起始化操作,别的线程只可以等待;当初叶化完结,等待的线程被升迁,然后发掘静态构造函数已经被推行过,就不会再进行。

二、语法  

public class StaticTester
{
    static StaticTester()
    {
    }
}

三、作用

  用于早先化静态成员。有时候大家会从配置文件读取一些值作为静态变量,类似那样:  

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. 运作时,优先对静态变量实行起首化。

      二.
只要有静态构造函数,那么在创立第1个实例对象恐怕引用任梁志成态变量以前,调用静态构造函数。

  3. 任何操作。

亚洲必赢官网 2

3.
在创建第二个实例或引用任张树涛态成员从前,将电动调用静态构造函数来初叶化类。

一、定义

四.
无法直接调用静态构造函数。

  由名称可见,静态构造函数(也称之为类型构造函数)包含“静态”和“构造函数”三个特征。第三个特征决定了它与静态函数类似,只好利用静态成员;第四脾性情决定了它与构造函数类似,具有初叶化成效,并且未有再次来到值。

伍.
只要静态构造函数引发那多少个,运转时将不会重新调用该构造函数,并且在程序运转所在的利用程序域的生存期内,类型将维持未初步化。

  与构造函数(针对实例对象)不一样的是,静态构造函数(针对类)只举行二遍,并且是在率先个实例对象创设前被调用,所以它可以用于那多少个只要求施行一次的操作;而且它不容许有public等修饰符,由程序自动调用,无法被外界调用。

    class Program
    {
        static void Main(string[] args)
        {
            // 在bus1实例化后调用静态构造函数,只调用一次
            Bus bus1 = new Bus(71);
            Bus bus2 = new Bus(72);
            bus1.Drive();
            System.Threading.Thread.Sleep(3600);
            bus2.Drive();
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    public class Bus
    {
        protected static readonly DateTime globalStartTime;
        protected int RouteNumber { get; set; }
        static Bus ()
        {
            globalStartTime = DateTime.Now;
            Console.WriteLine("static constructor sets global start time to {0}", globalStartTime.ToLongTimeString());
        }
        public Bus (int routeNum)
        {
            RouteNumber = routeNum;
            Console.WriteLine("Bus #{0} is created", RouteNumber);
        }
        public void Drive()
        {
            TimeSpan elapsedTime = DateTime.Now - globalStartTime;
            Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}", this.RouteNumber, elapsedTime.TotalMilliseconds, globalStartTime.ToLongTimeString());
        }
    }

  总计:静态构造函数用于起初化任陈蓉态数据,或然用于实践仅需实践一次的操作;在开立第2个实例对象可能引用任杨东态变量从前,将自动调用静态构造函数。

  

  特点:

  壹、静态构造函数既没有访问修饰符,也尚无参数。

  2、在成立第3个实例或引用任王姝态成员在此之前,将自动调用静态构造函数来早先化类。

  三、不可能直接调用静态构造函数。  

  4、在先后中,用户不能够调节何时实行静态构造函数。

  伍、线程安全。

  关于线程安全须要专门说多美滋下,由于程序恐怕在二十四线程景况下运营,也正是唯恐现身同时多少个线程筹划实行静态构造函数的动静。CLTucson确认保障这一个进度是安全的,实际上调用静态构造函数的线程要求先取得多个互斥线程同步锁,要是有多少个线程试图施行项目标静态构造函数,唯有二个线程能获得该锁;得到锁的线程落成起先类型初叶化操作,别的线程只好等待;当初步化实现,等待的线程被唤醒,然后发掘静态构造函数已经被执行过,就不会再实践。

二、语法  

    public class StaticTester
    {
        static StaticTester()
        {
        }
    }

三、作用

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

    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变量未被正确配置!");
            }
        }
    }  

4、试行各样

  一. 运行时,优先对静态变量实行最先化。

      二.
万1有静态构造函数,那么在开创第多个实例对象也许引用任黄澜态变量从前,调用静态构造函数。

  3. 别样操作。

网站地图xml地图