Pagini

2013-06-26

Singleton, Prototype si Object Pool - in romana

Celelalte 3 Design Pattern-uri creationale, conform sourcemaking.com. O sa parafrazez grosolan de acolo in cele ce urmeaza.

Design Pattern-ul Singleton

Cred ca este unul dintre cele mai cunoscute design pattern-uri. Intentia lui este sa puna la dispozitie la nivel global o instanta unica a unei anumite clase, care, in plus, poate fi initializata lenes (lazy), just-in-time.

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