1 – Qué es una clase estática en C#
Una clase estática (static class
) en términos generales es similar a una clase normal, pero tiene una diferencia crucial. Y es que no puede ser instanciada. Lo que quiere decir que para acceder a los miembros de una clase estática utilizando directamente el nombre de la clase estática.
Definimos una clase estática indicando la palabra static
, y cuando lo hacemos debemos incluir todos sus miembros como estáticos.
public static class Calculadora
{
public static int Suma(int x, int y)
{
return x + y;
}
}
Y cuando queremos referenciarla lo hacemos directamente llamando a la clase y al método que tambien es estático.
int resultadoSuma = Calculadora.Suma(1, 2);
2 – Métodos estáticos en C#
Cuando creamos un método, este método lo incluimos dentro de una clase, y podemos utilizarlo cuando instanciamos la clase. Como esta explicado en el ejemplo anterior, en el caso de ser un método estático no debemos instanciar la clase, ya que el método no pertenece a la instancia de la clase. Para ello debemos marcar el miembro como static.
Esta funcionalidad es activa independientemente de si la clase es estática o no, por ejemplo, en el siguiente código:
public class Calculadora
{
public static int Suma(int x, int y)
{
return x + y;
}
public double Media(List<int> valores)
{
return valores.Average();
}
}
Accedemos al método suma sin instanciar la clase, mientras que para utilizar el método media debemos instanciar la clase para poder acceder a él.
int resultadoSuma = Calculadora.Suma(1, 2);
Calculadora calc = new Calculadora();
double media = calc.Media(new List<int>());
3 – Cuando usar static
Para decidir si debemos crear una clase o un método como estática debemos preguntarnos si tiene sentido llamar al método o la clase independientemente del objeto.
- En el siguiente post veremos los “
extensión methods
” los cuales son estáticos.
Un ejemplo muy común, sobre todo cuando empezamos a programar, es tener una clase llamada “Util
” en la que ponemos las cosas que necesitamos, pero no tenemos muy claro donde, así que a para “útil” que van. Bien, los métodos ahí suelen ser, enviar mensajes, algún tipo de log, hacer un parseo. Métodos muy concretos que hacen una cosa muy concreta independientemente del contexto.
Una clase útil suele lucir como la siguiente:
public class Util
{
public static void LogError(string mensaje)
{
//codigo
}
public static bool ComprobarCaracteresEspeciales(string frase)
{
//Codigo
}
}
Al ser un método estático, podemos acceder al método directamente en vez de instanciar la clase, ósea: Util.LogError()
en cambio si los métodos no fueran estáticos deberíamos instanciar la clase, y para acceder lo haríamos de la siguiente forma: new Util().LogError()
.
- Debido a que es independiente del contexto, incluso si un método estático está dentro de una clase no estática, no podemos acceder a los miembros de la clase que no son estáticos. Esto quiere decir que, desde un miembro estático, solo podemos acceder a otros estáticos.
- Una clase estática es
sealed
(https://www.netmentor.es/curso/programacion-intermedia/sealed-csharp) por lo que otra no puede heredar de ella, eso implica que tampoco podemos utilizarpolimorfismo
(https://www.netmentor.es/curso/programacion-intermedia/polimorfismo-poo) - Si la clase es estática, contendrá únicamente miembros estáticos, mientras que, si no es estática, podrá contener tanto estáticos como no estáticos.
- No podemos incluir un constructor dentro de una clase estática.