Вы и @mjwills правы. При отсутствии явно определенного конструктора экземпляра он будет автоматически создан CLR , см. 10.11.4 спецификации языка C #. , поэтому эти два класса равны (кроме имени курса) в IL:
class A1 { }
class A2 { public A2() : base() { } }
Вы можете проверить, есть ли какой-либо статический конструктор в классе, например: typeof(A1).TypeInitializer
, или, точнее, typeof(A1).GetConstructors(BindingFlags.Static | BindingFlags.NonPublic)
.
Итак, давайте сделаем несколько простых проверок:
class A { }
typeof(A).TypeInitializer == null // true
typeof(A).GetConstructors(BindingFlags.Static | BindingFlags.NonPublic).Length == 0 // true
class B { static B { } }
typeof(B).TypeInitializer != null // true
typeof(B).GetConstructors(BindingFlags.Static | BindingFlags.NonPublic).Length == 1 // true
Однако, если вы используете инициализаторы статических полей или свойств, CLR добавит вам статический конструктор по умолчанию:
class C { public static int I = 1; }
typeof(B).TypeInitializer != null // true
typeof(B).GetConstructors(BindingFlags.Static | BindingFlags.NonPublic).Length == 1 // true
class D { public static int P { get; set; } = 1; }
typeof(B).TypeInitializer != null // true
typeof(B).GetConstructors(BindingFlags.Static | BindingFlags.NonPublic).Length == 1 // true
Еще одна проверка без инициализаторов полей и свойств:
class E { public static int I; public static int P { get; set; } }
typeof(E).TypeInitializer == null // true
typeof(E).GetConstructors(BindingFlags.Static | BindingFlags.NonPublic).Length == 0 // true