15静态构造方法

如何调用

静态构造方法调用只需要你在外面用这个类的其它静态方法时候才会调用,类似于静态类里调用静态方法的时候执行。

原理

静态类里的静态构造方法在执行的时候只会执行一次就不会执行了,哪怕再次执行这个静态类里的方法,即使是非静态类里的静态构造方法也是如此
但是,如果是泛型类则不一样,即使每次调用同一个静态构造方法,这个静态构造方法也会被多次执行,比如外面掉两次这个类,但是每次传的泛型不同,这个静态构造方法也会被执行两次,但是,如果两次都传同样的泛型,该静态构造方法也是只执行一次的

我们创建一个泛型非静态类,用于做泛型缓存程序集

 public class FormFactory<T>
{

private static List<Form> forms = new List<Form>();//存所有实例化后的窗体

  //用作缓存,缓存程序集的所有的类,
        private static List<Type> types;

static FormFactory()
        {
            string path = AppDomain.CurrentDomain.BaseDirectory;//获取当前项目的bin所在根目录根目录
            //加载Appraisal_System程序集
            Assembly ass = Assembly.LoadFile(path + "Appraisal_System.exe");//在c#里面,dll和exe后缀都是程序集

            //程序集里面的类的集合
            types = ass.GetTypes().ToList();//获取该程序集里面的所有类

        }
		
		//创建窗体的方法重载,通过反射根据传进来的窗体名字从程序集里拿到窗体类型创建窗体,解决了上面重载新建要给窗体要重复写代码问题
        public static Form CreateForm(string formName)
        {
            //从集合里查找指定窗体是否存在
            Form form = forms.Find(m => m.Name == formName);

            if (form == null)//判断窗体是否已经实例化,没有创建才给它创建并且添加到窗体的单例集合。
            {
                //从程序集集合里面找出我们需要的那个类(窗体)
                Type type = types.Find(m => m.Name == formName);

                //创建该窗体的实例
                form = (Form)Activator.CreateInstance(type);

                //将这个实例添加到单例窗体集合
                forms.Add(form);
            }
            return form;//返回该窗体

        }

}

可以看到,我们在这个泛型类里面创建了一个静态构造方法static FormFactory(),和一个静态方法CreateForm(string formName),在外面窗体我们在加载事件里调用一下CreateForm方法,用来触发静态构造方法。

image

然后,我们在这个窗体的树形菜单控件的选择后的事件里也调用该方法

image

接着,我们在该静态构造方法里打断点进行调试

image

我们通过运行调试发现,在加载该窗体的时候会调用该静态构造方法,然后在树形控件里随便选中一个节点时候也会调用该静态构造方法。但是,如果我们将上面或者下面调用该类的静态方法时候传的泛型类型统一的话,那么,通过调试发现,我们只会在窗体加载的时候进入该静态构造方法,而在后面树形控件上面单击选中节点时候就不会进去该静态构造方法了,因为静态类的静态构造方法在程序运行时候只能运行一次。


总结

如果我们在外面有两个地方调用该类里面的静态方法,而且这两个地方在调用的时候传相同的泛型类型的话,它会认为你是在调用同一个FormFactory类,
以就只会执行一次静态构造方法,因为静态类的静态构造方法在程序运行时候只能运行一次,尽管你多次调用,只要传的泛型类型一致,那么也只是调用一次静态构造方法。
但是,如果你在外面两次调用该类的静态方法时候传的泛型类型不一致时,它会调用两次该类的静态构造方法,它会认为你是在调用两个不同的FormFactory类,每次调用的时候就都会调用该类的静态构造方法,创建新的类。

posted @ 2021-11-28 11:55  青仙  阅读(408)  评论(0编辑  收藏  举报