TOC

This article is currently in the process of being translated into Spanish (~99% done).

Clases:

Static members

Como vimos en un capítulo anterior, la forma común de comunicarse con una clase es creando una nueva instancia de la clase y trabajar con el objeto resultante. En la mayoría de los casos, en esto consisten las clases; la habilidad de instanciar múltiples copias de la misma clase y usarlas de forma diferente. Sin embargo, en algunos casos, tal vez quieras tener una clase y usarla sin tener que instanciarla, o por lo menos una clase en la que puedas usar sus miembros sin crear un objeto de la clase. Por ejemplo, puedes tener una clase con una variable que siempre permanece igual sin importar dónde y cómo se use. A esto se llama miembro estático, porque permanece igual.

Una clase puede ser estática y puede tener miembros estáticos, tanto funciones como campos. Una clase estática no se puede instanciar o en otras palabras, funciona más como un conjunto de miembros relacionados que como una clase real. En su lugar, podrías crear una clase no-estática, pero que contenga algunos miembros estáticos. Una clase no-estática puede ser instanciada y usada como una clase regular, pero no puedes usar un miembro estático en un objeto de la clase. Una clase estática debe contener solamente miembros estáticos.

Primero, aquí hay un ejemplo de una clase estática:

public static class Rectangle
{
    public static int CalculateArea(int width, int height)
    {
        return width * height;
    }
}

Como puedes ver, se usa la palabra reservada static para marcar la clase como estática, y se vuelve a usar para marcar el método, CalculateArea, como estático también. Si esto no se hubiera hecho, el compilador se quejaría, ya que no podemos tener un miembro no-estático de una clase estática.

Para usar este método, lo llamamos directamente en la clase, de esta forma:

Console.WriteLine("The area is: " + Rectangle.CalculateArea(5, 4));

Podemos añadir otros métodos útiles a la clase Rectangle, pero tal vez te preguntes, ¿por qué estamos pasando width y height al método, en lugar de almacenarlos dentro de la clase y de ahí extraerlos cuando se necesiten? ¡Porque es estático! Podríamos almacenarlos, pero solamente un conjunto de valores, debido a que hay solamente una versión de una clase estática. Es muy importante entender esto.

En su lugar, podemos hacer una clase no-estática, y usar la función CalculateArea como una función utilitaria a esta clase:

public class Rectangle
{
    private int width, height;

    public Rectangle(int width, int height)
    {
        this.width = width;
        this.height = height;
    }

    public void OutputArea()
    {
        Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
    }

    public static int CalculateArea(int width, int height)
    {
        return width * height;
    }
}

Como se puede ver, hemos vuelto la clase no-estática. Además agregamos un constructor, el cual acepta width y height y los asigna a la instancia. Después agregamos un método OutputArea, el cual utiliza el método estático para calcular el área. Este es un buen ejemplo de intercambio de miembros estáticos con miembros no-estáticos, en una clase no-estática.

Otro uso frecuente de clases estáticas, aunque no sea del agrado de algunos, son las clases utilitarias/helper, en las que se juntan varios métodos, los cuales pueden o no pertenecer juntos, pero que tampoco parecen pertenecer a ningún otro lado.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!