Miembros de tipo
En realidad, dentro la definición de un tipo de dato no tienen 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:
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 polimorfismo. Por ello, incluir los modificadores virtual, override o abstract al definir un método static es considerado erróneo por el compilador. Eso no significa que los miembros static no se hereden, sino tan sólo que no tiene sentido redefinirlos.