[.NET] ¿Qué son las Static Classes?


Una static class es aquella clase que se usa sin necesidad de realizar una instanciación de la misma. Se utiliza como una unidad de organización para métodos no asociados a objetos particulares y separa datos y comportamientos que son independientes de cualquier identidad del objeto.
Las clases estáticas son adecuadas cuando no tienen que almacenar información, sino sólo realizar cálculos o algún proceso que no cambie. Los datos de miembros estáticos se almacenan en una zona especial del Heap denominado High Frequency Heap.

En el .NET Framework tenemos ejemplos de clases estáticas como System.Console, System.Math, System.Environment, etc…

Los requisitos a la hora de crear una clase estática son los siguientes:

  • La clase debe derivar directamente de System.Object porque la herencia se aplica a clases de instancia y como hemos dicho, una clase estática no realiza intanciación alguna.
  • La clase no debe implementar ningún interfaz ya que que los métodos del interfaz son llamados en una instancia de la clase.
  • La clase debe definir únicamente miembros estáticos. Cualquier miembro de instancia provocará un error de compilación.
  • La clase no puede usarse como un campo, como parámetro de un método o como variable local ya que todos estos conceptos refieren a una instancia.
  • Sólo puede contener constructores estáticos y privados.

Se usa el modificador static para definir una clase o miembro estático.

Veamos un ejemplo de clase estática:

using System;

public static class MyStaticClass
{
    public static void StaticMethod() { }

    private static string staticField;
    public static string StaticProperty
    {
        get { return staticField; }
        set { staticField = value; }
    }
}

Al compilar este código y desensamblarlo con ILDASM.exe podemos observar el modificador static provoca que la clase se genere como abstract para prevenir la instanciación y sealed para prevenir la herencia y no se genera ningún constructor de instancia de la clase.

MyStaticClass IL

Para emplear tanto el método StaticMethod() como la propiedad estática StaticProperty simplemente realizaremos la llamada empleando el nombre de la clase:

MyStaticClass.StaticMethod();
MyNonStaticClass.StaticProperty = "Sergio Parra Guerra";

¿Y si tenemos un miembro estático en una clase NO estática?

Definimos el siguiente un ejemplo de clase NO estática:

using System;

public class MyNonStaticClass
{
    public static void StaticMethod() { }

    private static string staticField;
    public static string StaticProperty
    {
        get { return staticField; }
        set { staticField = value; }
    }

    private int nonStaticField;
    public int NonStaticProperty
    {
        get { return nonStaticField; }
        set { nonStaticField = value; }
    }
}

Al compilar este código y desensamblarlo con ILDASM.exe podemos observar modificaciones en el código IL tal como la presencia de un constructor (.ctor) y la propiedad NonStaticProperty marcada como instance.

MyNonStaticClass IL

Podemos usar el método estático StaticMethod() y su propiedad estática StaticProperty como en el ejemplo anterior de la misma forma, pero la salvedad es que ahora podemos instanciar un objeto de la clase MyNonStaticClass y acceder a los miembros de instancia.

MyNonStaticClass.StaticMethod();
MyNonStaticClass.StaticProperty = "Sergio Parra Guerra";

MyNonStaticClass myNonStaticClass = new MyNonStaticClass();
myNonStaticClass.NonStaticProperty = 2;

Con esto hemos visto qué son las static classes y cómo se usan en nuestros programas.

Deja un comentario