C#-------------类型构造器

C#静态字段初始化
本文探讨了C#中静态字段的初始化顺序及类型构造器的概念。通过对比不同代码实现的效果,解释了静态字段与静态构造函数之间的执行顺序,并介绍了如何通过添加静态构造函数来调整这一顺序。
    class Foo
    {
        public static string Field = GetString("Initialize the static field!");
        public static string GetString(string s)
        {
            Console.WriteLine(s);
            return s;
        }
    }

执行代码:

        static void Main(string[] args)
        {
            Console.WriteLine("Start.....");
            Foo.GetString("Manually invoke the static GetString() Method!");
            Console.Read();
        }

运行结果:

有的人肯定想这个是理所当然的,因为一般的执行过程如下:

  1.静态字段

  2.静态构造函数

  3.实例字段

  4.实例构造函数

 

但如果我们稍微的修改一下代码呢!!!

        static void Main(string[] args)
        {
            Console.WriteLine("Start.....");
            Foo.GetString("Manually invoke the static GetString() Method!");
            var d = Foo.Field;
            Console.Read();
        }

这个你知道是为什么吗?

  要解释这个,我们还需要知道类型构造器(.cctor)

  我们将从源代码解析!!!!

  

我们可以看到在这个类的声明上面多了一个beforefieldinit 关键字,表明在任何时候都可以执行构造器

  如果我们想让代码向最开始一样执行,那么我们只需要加上一个静态构造函数

    class Program
    {
        /*
         类型构成器的两种形式:
         *  1.precise(有显示的声明构造函数)
         *  2.beforefieldinit  d8hkt1yJm95NtWBdPjwh
         */
        static void Main(string[] args)
        {
            Console.WriteLine("Start.....");
            Foo.GetString("Manually invoke the static GetString() Method!");
            var d = Foo.Field;
            Console.Read();
        }
    }
    class Foo
    {
        static Foo()
        {

        }
        public static string Field = GetString("Initialize the static field!");
        public static string GetString(string s)
        {
            Console.WriteLine(s);
            return s;
        }
    }

  因为加了静态的构造函数,程序的运行就会向原来的那样执行

转载于:https://www.cnblogs.com/student-note/p/6823817.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值