My kemenworld…

To mock or not to mock…

Clases y Constructores estáticos

Posted by kementeus en enero 25, 2008

Para muchos es conocido ya desde tiempos inmemoriables la existencia de los métodos estáticos de una clase, pero por alguna razón no muchos recordamos la existencia de los constructores estáticos y las clases estáticas (algo “nuevo” en la framework 2.0). Comencemos con los constructores estáticos, como siempre tomemos a nuestra clase ejemplo:

Bien, en este ejemplo trivial sucede lo que esperamos todos que suceda, se ejecuta primero el método de la clase base y luego nuestro constructor:

   1: using System;
   2:  
   3: public class A
   4: {
   5:     public A()
   6:     {
   7:         Console.WriteLine("hola desde A!");
   8:     }
   9: }
  10:  
  11: public class B : A
  12: {
  13:     public B()
  14:     {
  15:         Console.WriteLine("hola desde B!");
  16:     }
  17: }
  18:  
  19: public class Runner
  20: {
  21:     public static void Main(string[] args)
  22:     {
  23:         A a = new A();
  24:         B b = new B();
  25:         A ab = (A) new B();
  26:         Console.ReadKey();
  27:     }
  28: }

Notemos que también, como es de esperar, cada vez que invocamos un constructor este se ejecuta. No sería interesante (y a veces necesario) que por cada vez que ejecutemos un constructor se ejecute una vez y sólo una vez? alguien por ahí me dirá: “Si, obviamente de eso se tratan los singletons no?” Bueno, para eso estan los constructores estáticos. Cambiemos la definición de la clase padre:

   1: public class A
   2: {
   3:     static A()
   4:     {
   5:         Console.WriteLine("hola desde A!");
   6:     }
   7: }

Como vemos el primer cambio es que el constructor se ejecuta una vez y solo esa vez, si quieren prueben y cambien también el constructor de la clase B. Podemos tener un constructor estático junto con uno “normal”? Claro que sí! cambiemos la definición ahora para que luzca algo así:

   1: public class A
   2: {
   3:     static A()
   4:     {
   5:         Console.WriteLine("hola desde A!");
   6:     }
   7:     
   8:     public A()
   9:     {
  10:         Console.WriteLine("hola desde A normal!");
  11:     }
  12: }

Obviamente el constructor “normal” seguirá comportandose como debe ser y el estático como un señor estático😛, puede el constructor estático usar campos no estáticos de la clase?, pues claro que no!, como la clase aún no ha sido inicializada el constructor estático solamente puede acceder a elementos estáticos de la clase. Si en el ejemplo anterior la clase B tiene un constructor estático cual creen que sería el orden de ejecución de los constructores? Cambiemos el ejemplo a algo así:

   1: public class A
   2: {    
   3:     static A()
   4:     {
   5:         Console.WriteLine("hola desde A!");
   6:     }
   7:     
   8:     public A()
   9:     {
  10:         Console.WriteLine("hola desde A normal!");
  11:     }
  12: }
  13:  
  14: public class B : A
  15: {
  16:     static B()
  17:     {
  18:         Console.WriteLine("hola desde B!");
  19:     }
  20:     
  21:     public B()
  22:     {
  23:         Console.WriteLine("hola desde B normal!");
  24:     }
  25: }

Al ejecutarlo tenemos la siguiente salida:

hola desde A!
hola desde A normal!
hola desde B!
hola desde A normal!
hola desde B normal!
hola desde A normal!
hola desde B normal!

Hablando de estáticos, alguien recuerda las típicas clases Helpers que por lo general se usan en operaciones matemáticas y que simplemente tienen métodos los cuales por lo general no necesitamos inicializar, antes era típico encontrarse con clases donde todos sus elementos eran estáticos, bien, a partir de la Net Framework 2.0 tenemos la existencia de clases estáticas, veamos el siguiente ejemplo:

   1: using System;
   2:  
   3: public static class A
   4: {    
   5:     public static void SayHello()
   6:     {
   7:         Console.WriteLine("hola mundo!");
   8:     }
   9: }
  10:  
  11: public class Runner
  12: {
  13:     public static void Main(string[] args)
  14:     {
  15:         A.SayHello();
  16:         Console.ReadKey();
  17:     }
  18: }

Pueden las clases estáticas tener constructores estáticos? Claro que sí! una clase estática es una clase sellada y abstracta, por lo que no podemos derivar de ella ni instanciarla. Fueron diseñadas para lo que hacen muy bien, servir como repositorios de funciones estáticas.

Bien, hasta aquí llego hoy con mi sesión básica de C#, a ver que día vuelvo a escribir! saludos!

4 comentarios to “Clases y Constructores estáticos”

  1. Carlos said

    hola muy interesante el tema de “Clases y Constructores estáticos”, sabes estoy interesado en dar el examen 70-536 y luego el 70-526 y obtener la credencial MCTS en Windows Forms Applications, se que no es facil, actualmente me dedico mucho a estudiar, aveces termino algo estresado, cansado, temeroso.. en fin, te agradeceria muchisimo si me pudieras indicar algunos links de importancia aparte de los de la libreria On-line de Microsoft..
    gracias de ante mano….
    y felicidades nuevamente por la Credencial..!!
    Saludos
    Carlos Villa Sanchz

  2. carloslone said

    Excelente Articulo mi amigo Christian!

    Saludos,

    Carlos Lone

  3. […] y de paso visiten https://kementeus.wordpress.com/2008/01/25/clases-y-constructores-estticos/), bien, trataré de llevarlos un poco más allá de esos conceptos en esta corta serie de post […]

  4. […] y de paso visiten https://kementeus.wordpress.com/2008/01/25/clases-y-constructores-estticos/), bien, trataré de llevarlos un poco más allá de esos conceptos en esta corta […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: