Спасибо за внимание к спецификации языка c #

вы соединяете вызовы конструктора, используя синтаксис:

public frmConfirm(): this(1)

когда вызывается перегруженный конструктор? Кроме того, может ли кто-нибудь подтвердить, что если класс является формой, проблемы возникнут из-за вызова InitializeComponent () в обоих конструкторах?

 RBT14 февр. 2018 г., 12:48
 Fredrik Mörk05 янв. 2011 г., 23:23
@ madmik3: просто написать код, чтобы увидеть, что происходит. Вопрос в том, является ли этогарантированный случиться при любых обстоятельствах (разные ОС, разные версии CLR).

Ответы на вопрос(3)

Спецификация языка C #, В разделе10.11.1, Инициализаторы конструктора Вы можете прочитать (ударение мое):

Все конструкторы экземпляров (кроме тех, которые предназначены для объекта класса) неявно включают вызов другого конструктора экземпляранепосредственно перед конструктор-тело.

Дальнейшее чтение показывает, что:

если конструктор имеет инициализатор конструктора экземпляра формыbase(arguments)будет вызван конструктор из прямого базового класса.если конструктор имеет инициализатор конструктора экземпляра формыthis(argument)конструктор в самом классе будет вызван.если инициализатор конструктора экземпляра не предоставлен,base() будет добавлено автоматически.
 Ronnie08 мар. 2016 г., 14:43
Спасибо за внимание к спецификации языка c #
Решение Вопроса

ляющего конструктора. Генерируемая последовательность IL является немедленнойcall другому конструктору, за которым следует IL, сгенерированный из операторов в конструкторе.

Так что, если вы подключитесь к другому конструктору, и этот конструктор вызоветInitializeComponent() вызывающий конструктор не должен вызывать этот метод.

Например, учитывая этот пример класса:

class Foo {
    public int A, B;

    public Foo() : this(1) {
        B = 2;
    }

    public Foo(int a) {
        A = a;
    }
}

Это сгенерированный IL:

  .class private auto ansi beforefieldinit Foo
        extends [mscorlib]System.Object
  {
    .field  public  int32 A
    .field  public  int32 B

    // method line 1
    .method public hidebysig  specialname  rtspecialname
           instance default void '.ctor' ()  cil managed
    {
        .maxstack 8
        IL_0000:  ldarg.0
        IL_0001:  ldc.i4.1
        IL_0002:  call instance void class Foo::'.ctor'(int32)
        IL_0007:  ldarg.0
        IL_0008:  ldc.i4.2
        IL_0009:  stfld int32 Foo::B
        IL_000e:  ret
    } // end of method Foo::.ctor

    // method line 2
    .method public hidebysig  specialname  rtspecialname
           instance default void '.ctor' (int32 a)  cil managed
    {
        .maxstack 8
        IL_0000:  ldarg.0
        IL_0001:  call instance void object::'.ctor'()
        IL_0006:  ldarg.0
        IL_0007:  ldarg.1
        IL_0008:  stfld int32 Foo::A
        IL_000d:  ret
    } // end of method Foo::.ctor

  } // end of class Foo

Обратите внимание, что конструктор no-arg вызывает другой конструктор, прежде чем присвоить 2 полю B.

 JeffE05 янв. 2011 г., 23:22
Отлично. Вот что я подумала спасибо
 cdhowie15 июл. 2014 г., 16:32
@arvimanFoo:.ctor() звонитFoo:.ctor(int32), но это в свою очередь вызываетSystem.Object:.ctor(), не Foo:.ctor().
 arviman15 июл. 2014 г., 08:39
MSIL не вызовет круговую ссылку? (я знаю, что не будет, но я не могу понять почему). Кажется, что .ctor () вызывает .ctor (int32 a) и наоборот. Кто-нибудь может уточнить, почему этого не происходит?

this(1) Конструктор вызывается первым.

Насколько ваш второй вопрос идет из-заInitializeComponent и другие проблемы с наследованием форм, я бы посоветовал вам использовать композицию вместо наследования.

 JeffE05 янв. 2011 г., 23:24
Мне известны некоторые проблемы с наследованием форм, но это лучшее решение для моего проекта

Ваш ответ на вопрос