C#的静态构造函数(主要说的是编译器为Lambda表达式生成的类)

静态构造函数

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

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

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

  1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
  
  2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。

  3、一个类只能有一个静态构造函数。

  4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。

  5、最多只运行一次。

  6、静态构造函数不可以被继承。

  7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
  

静态构造函数和闭包

之所以会记录这个静态构造函数的知识是因为我在查看编译器为Lambda生成的一个类,下列代码:

 class Program
    {
        public delegate string HelloWord(string word);
        static void Main(string[] args)
        {
            HelloWord world = word =>
            {
                Console.WriteLine(word);
                return word;
            };
            world("HelloWorld");
            Console.ReadKey();
        }
    }

编译器会为HelloWorld生成一个类型:
这里写图片描述
这个暂且不表,不属于本文要介绍的内容。接着来看lambda生成了什么:

word=>
      {
          Console.WriteLine(word);
          return word;
      };

对应这句,编译器为我们生成了一个类:
这里写图片描述
这个类中就有一个静态函数,这个静态函数会保证<>c类的实例化(我推测的)。
这个类表达的意思是将上面这个Lambda表达式的方法放到了这个编译器生成的类中。闭包也是在这个基础上形成的,请看下面的代码:

 class Program
    {
        static void Main(string[] args)
        {
            int x = 6;
            Action<int> action = _ => Console.WriteLine(x);
        }
    }

Lambda表达式捕获了Main方法中的x变量之后,被编译器编译为下面这个类:
这里写图片描述
我以前的理解是只有Lambda表达式在捕获到变量的情况下才会生成一个类,现在来看,不管有没有捕获变量,编译器都会为Lambda表达式来生成一个类用来存储Lambda表达式所代表的方法,只是如果捕获了变量,这个类中会将外部变量打包进来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值