欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

怪异现象:执行静态方法,其静态构造函数没有执行

程序员文章站 2022-05-01 11:25:07
最近在重构代码时,有多个发送API请求的帮助类,分别向不同的API站点发送请求,并反序列化返回结果。API又都是我们自己的,所以不同API帮助类的逻辑都差不多,有很多Copy-Paste代码,就是API的域Addr不一样,所以当然要重构一下啦 源代码就不贴了,贴一段遇到问题后我的测试代码 期望能输出 ......

最近在重构代码时,有多个发送API请求的帮助类,分别向不同的API站点发送请求,并反序列化返回结果。API又都是我们自己的,所以不同API帮助类的逻辑都差不多,有很多Copy-Paste代码,就是API的域Addr不一样,所以当然要重构一下啦

源代码就不贴了,贴一段遇到问题后我的测试代码

 1 using System;
 2 
 3 namespace ConsoleApp1
 4 {
 5     public class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9 
10             C1.writeA();
11             C1.writeB();
12             C2.writeA();
13             C2.writeB();
14 
15             Console.ReadKey();
16         }
17     }
18 
19     public class CBase<T>
20     {
21         static CBase()
22         {
23 
24         }
25 
26         public static string A { get; set; }
27         public static string B { get; set; }
28 
29         public static void writeA()
30         {
31             Console.WriteLine(A);
32         }
33 
34         public static void writeB()
35         {
36             Console.WriteLine(B);
37         }
38     }
39 
40     public class C1 : CBase<C1>
41     {
42         static C1()
43         {
44             A = "abc";
45             B = "def";
46         }
47     }
48 
49     public class C2 : CBase<C2>
50     {
51         static C2()
52         {
53             A = "123";
54             B = "456";
55         }
56 
57     }
58 }

期望能输出 abc def 123 456,但什么都没输出

经调试发现C1、C2的静态构造函数都没有执行,所以问题就在这,调用了其静态方法WriteA WriteB,为什么其静态构造函数没有执行呢

我们都知道静态构造函数的调用时机:在首次实例化该类或任何的静态成员被引用时,.NET CLR会首先自动调用其静态构造函数

所以结论就只能是:任何的静态成员被引用,这个静态成员,是不包括基类的静态成员的