Pagini

2013-06-17

Ordinea in care se initializeaza membrii claselor in C#

Se pune urmatorul cod in LINQPad:


void Main() {
 Derived d = new Derived();
}

class Base {
   public Base() { 
       Console.WriteLine( "Base.Instance.Constructor" );
       this.m_Field3 = new Tracker( "Base.Instance.Field3 (in instance constructor)" );
       this.Virtual();
   }
   static Base() {
       Console.WriteLine( "Base.Static.Constructor" );
   }
   virtual public void Virtual() {
       Console.WriteLine( "Base.Instance.Virtual" );
   }
   private Tracker m_Field1 = new Tracker( "Base.Instance.Field1" );
   private Tracker m_Field2 = new Tracker( "Base.Instance.Field2" );
   private Tracker m_Field3;
   static private Tracker s_Field1 = new Tracker( "Base.Static.Field1" );
   static private Tracker s_Field2 = new Tracker( "Base.Static.Field2" );
}

class Derived : Base {
   public Derived() {
       Console.WriteLine( "Derived.Instance.Constructor" );
       this.m_Field3 = new Tracker( "Derived.Instance.Field3 (in instance constructor)" );
   }
   static Derived() {
       Console.WriteLine( "Derived.Static.Constructor" );
   }
   override public void Virtual() {
       Console.WriteLine( "Derived.Instance.Virtual" );
   }
   
   private Tracker m_Field1 = new Tracker( "Derived.Instance.Field1" );
   private Tracker m_Field2 = new Tracker( "Derived.Instance.Field2" );
   private Tracker m_Field3;
   static private Tracker s_Field1 = new Tracker( "Derived.Static.Field1" );
   static private Tracker s_Field2 = new Tracker( "Derived.Static.Field2" );
}

class Tracker {
   public Tracker( string text ) {
       Console.WriteLine( text );
   }
}

se apasa F5 si apoi se admira rezultatul:

Derived.Static.Field1
Derived.Static.Field2
Derived.Static.Constructor
Derived.Instance.Field1
Derived.Instance.Field2
Base.Static.Field1
Base.Static.Field2
Base.Static.Constructor
Base.Instance.Field1
Base.Instance.Field2
Base.Instance.Constructor
Base.Instance.Field3  (in instance  constructor)
Derived.Instance.Virtual
Derived.Instance.Constructor
Derived.Instance.Field3  (in instance constructor)


Concluzia? membrii claselor se initializeaza in ordinea urmatoare:
  1. membrii statici initializati la declarare
  2. constructorul static
  3. membrii de instanta initializati la declarare
  4. clasa de baza
  5. constructorul

Niciun comentariu:

Trimiteți un comentariu

S-ar putea sa nu vedeti comentariul aparand imediat, asta inseamna ca el asteapta aprobarea mea. Aceasta e o masura anti-SPAM.