glantucan / puzzle_game

A small Unity basics review example and start point to go to a modular design
1 stars 1 forks source link

Duda - Definir variables (Public/Private/Static) #9

Closed JorgeHurtado closed 5 years ago

JorgeHurtado commented 8 years ago

Hola, tengo dos preguntillas que me han surgido haciendo el proyecto del videojuego cuando intentaba usar una variable de un script en otro script distinto. Creo que no hemos dado esto en clase, pero lo necesito saber para poder entender cómo funciona y usarlo en mi código.

1) ¿Que diferencia hay entre una variable publica, una privada y una estática?

2) Si yo defino una variable;

       `int x = 0;`

¿Esta variable es privada?

glantucan commented 8 years ago

Para que diferenciemos entre unas y otras, hemos visto:
Propiedades privadas: Las variables definidas al principio de la clase (fuera de cualquier funciín pero dentro del bloque de la clase) y con private delante. Son accesibles desde cualquier método de la misma clase.

Propiedades públicas: Las variables definidas al principio de la clase (fuera de cualquier funciín pero dentro del bloque de la clase) y con publicdelante. Son accesibles desde cualquier método de la misma clase y desde otras clases. NO se deben usar, aunque se pueda. Todas las propiedades deberían ser privadas. Para acceder y modificar valores de propiedades de otra clase se deberían usar métodos públicos.

Variables locales: Las definidas dentro de una función (no llevan nunca ni public ni private)

Las propiedades son en realidad variables de las instancias de la clase. Es decir, se crean en el momento en el que se crea una o más instancias de la clase y cada instancia puede tener valores diferentes guardados en sus propiedades, sean públicas o privadas.

Las propiedades estáticas, son variables de la clase, no de sus instancias. Es decir, si una propiedad es estática no se crea una diferente para cada instancia. Si la propiedad estática es pública se accede a ella a través del nombre de la clase.
Vector3.right es una propiedad pública estática de la clase Vector3. Sin embargo la propiedad up de la clase Transform no es estática y uno puede acceder al valor concreto que tenga una instancia concreta de la clase Transform, por ej.: this.transform.up . Esa es la diferencia entre estática y normal.

Dicho esto. Está bien utilizar las propiedades estáticas que ya existen en C# o en Unity, pero NUNCA deberíais crear propiedades estáticas en vuestras clases, aunque veáis que en algunos tutoriales las utilicen, porque son de facto variables globales a las que se puede acceder desde cualquier otra clase, con todos los peligros que ello conlleva.

Respecto a las propiedades normales, si no pones nada delante (public o private) el compilador entiende que son protected que es parecido a private pero no es exáctamente lo mismo. Así que es mejor que siempre pongáis delante lo que queréis que sea, y por lo que he dicho antes, debería ser siempre private.

JorgeHurtado commented 8 years ago

Vale, gracias.