zoukankan      html  css  js  c++  java
  • 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;
            }
        }

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

    Hold on, everything is possible.
  • 相关阅读:
    WCF Data Contract之集合类型
    LINQ To DataSet
    WCF Data Contract之枚举
    初识Parallel Extensions之TPL(二)
    初识Parallel Extensions之TPL
    java北京行之单例模式的引入
    Strut2 入门
    解决 Eclipse 下使用 Ant 编译出现问题: 警告:编码 GBK 的不可映射字符
    解决 Ant 非法字符: \65279
    [原创]Visual Studio 中引用 Flash 控件
  • 原文地址:https://www.cnblogs.com/student-note/p/6823817.html
Copyright © 2011-2022 走看看