En realidad, dentro la definición
de un tipo de dato no tiene porqué incluirse sólo definiciones de miembros
comunes a todos sus objetos, sino también pueden definirse miembros ligados al
tipo como tal y no a los objetos del mismo. Para ello basta preceder la
definición de ese miembro de la palabra reservada static, como muestra
este ejemplo:
class A
{
int x;
static int y;
}
Los objetos de clase A sólo van a disponer del campo x, mientras que el campo y
va a pertenecer a la clase A. Por
esta razón se dice que los miembros con modificador static son miembros
de tipo y que los no lo tienen son miembros
de objeto.
Para acceder a un miembro de
clase ya no es válida la sintaxis hasta ahora vista de <objeto>.<miembro>, pues al no
estar estos miembros ligados a ningún objeto no podría ponerse nada en el campo
<objeto>. La sintaxis a
usar para acceder a estos miembros será <nombreClase>.<miembro>, como muestra
ejemplo donde se asigna el valor 2 al miembro y
de la clase A definida más arriba:
A.y = 2;
Nótese que la inclusión de
miembros de clase rompe con la afirmación indicada al principio del tema en la
que se decía que C# es un lenguaje orientado a objetos puro en el que todo con
lo que se trabaja son objetos, ya que a los miembros de tipo no se les accede a
través de objetos sino nombres de tipos.
Es importante matizar que si
definimos una función como static, entonces el código de la misma sólo podrá
acceder implícitamente (sin sintaxis <objeto>.<miembro>)
a otros miembros static
del tipo de dato al que pertenezca. O sea, no se podrá acceder a ni
a los miembros de objeto del tipo en que esté definido ni se podrá usar this
ya que el método no está asociado a ningún objeto. O sea, este código sería
inválido:
int x;
static void Incrementa()
{
x++;
//ERROR: x es miembro de objeto e
Incrementa() lo es de clase.
}
También hay que señalar que los
métodos estáticos no entran dentro del mecanismo de redefiniciones descrito en
este mismo tema. Dicho mecanismo sólo es aplicable a métodos de objetos, que
son de quienes puede declararse variables y por tanto puede actuar el
polimorifsmo. Por ello, incluir los modificadores virtual, override o abstract al
definir un método static es
considerado erróneo por el compilador; aunque ello no significan que los
miembros static
no se hereden, sino sólo tiene sentido redefinirlos.