一、.Net基础【1.20】Static静态构造函数

1.静态构造函数 

静态构造函数在类第一次被使用的时候执行一次,在构造函数执行之前执行。只要用到类,哪怕没new对象(比如只是声明变量)也会被执行,且只执行一次。

2.注意事项

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

3.例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace console2
{
    class MyTest
    {
        static MyTest()
        {
            Console.WriteLine("zi 静态代码块");
        }
        public MyTest()
        {
            Console.WriteLine("zi 构造方法");
        }
    }
}

//主函数
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace console2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyTest t1 = new MyTest();
            MyTest t2 = new MyTest();
            Console.ReadKey();
        }
    }
}
//输出结果:
// zi 静态代码块
// zi 构造方法
// zi 构造方法。

 4.静态成员初始化问题代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace console2
{
    class MyJingTaiDaimaKuai
    {
        public static int i = test1();//最开始执行
        public int age = test2();//new的时候先执行成员变量的初始化,再执行构造函数

        static MyJingTaiDaimaKuai()
        {
            Console.WriteLine("静态代码块");//再执行
        }
        public MyJingTaiDaimaKuai()
        {
            Console.WriteLine("构造函数");
        }

        public static int test1()
        {
            Console.WriteLine("test1");
            return 3;
        }

        public static int test2()
        {
            Console.WriteLine("test2");

            return 333;
        }
    }
}
//主函数
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace console2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyJingTaiDaimaKuai a1 = new MyJingTaiDaimaKuai();
            Console.WriteLine(a1.age);

            MyJingTaiDaimaKuai a2 = new MyJingTaiDaimaKuai();
            Console.WriteLine(a2.age);
            Console.ReadKey();
        }
    }

}

原文地址:https://www.cnblogs.com/lolitagis02/p/8094905.html