Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre un tema muy particular de las clases que son los get y set, tambien conocidos como getter and setter, veremos para que se usan y porque se usan.

Anuncios

En el caso de hoy hablaremos mas sobre las propiedades de las clases, hasta ahora hemos visto que una buena practica es dejar las variables de la clase en private (o por lo menos no en public) y despues por medios de metodos ponerles informacion o recuperarlas pero C# nos provee un mecanismo para poder hacer lo mismo sin necesidad de tener que crear metodos extras, este mecanismo se llama getter and setter, su sintaxis basica es:

<private> tipoDato _nombre;
public tipoDato nombre
{
	set
	{
	    ... instrucciones ...
	}
	get
	{
	    ... instrucciones ...
	}
}
Anuncios
Anuncios

Primero hablemos sobre la variable que vamos a usar o estar expuesta, el modificador de dato siempre debe ser public (para poder acceder desde la instancia del objeto), el tipo de dato es el de la variable que vamos a crear, el nombre de la variable lo mismo, luego usamos un bloque con llaves, y en ella usamos a set y get, para ambos casos debemos usar un bloque de llaves, tambien nos brinda la posibilidad de poder usar las instrucciones que creamos necesarias, en cambio cuando cuando usemos a get necesitaremos devolver el valor de la variable en cuestion y para ello usaremos otra variable pero que sera privada, la definida primero, en este caso podemos usar private o no ya que en ambos casos se considerara privada, o mejor dicho internal, el tipo de dato debe ser igual a la otra variable y la mayor diferencia es que por convencion se le pone el guion bajo o undercore (_) seguido del mismo nombre que la otra, a continuacion veamos un ejemplo simple:

private string _nombre;
public string nombre
{
	set
	{
	    ... instrucciones ...
	}
	get
	{
	    ... instrucciones ...
	}
}
Anuncios
Nota: Recuerden que es una convencion entre programadores, no es obligatorio y se puede usar de cualquier forma pero esta es la buena practica.
Anuncios

Para entender mejor el concepto, vamos a crear una nueva solucion llamada GetSet:

  • Lenguaje: C#
  • Plataforma: Windows
  • Tipo de Proyecto: Consola (Net Framework)
  • Nombre Proyecto: GetSet
  • Nombre Solucion: GetSet
Anuncios

Una vez generado nuestro proyecto vamos a agregar una nueva clase, en este caso click con el boton derecho sobre el proyecto (en el explorador de soluciones) y seleccionamos Agregar -> Clase, le asignamos el titulo de Persona.cs y le damos Aceptar, una vez creado procedemos a modificar el codigo generado automaticamente por el siguiente:

Persona.cs

namespace GetSet
{
    class Persona
    {
        public string nombre;
        public int edad;
    }
}
Anuncios

En este codigo declaramos dos variables de tipo public la primera de tipo string llamada nombre y la segunda de tipo int llamada edad, nuestro siguiente paso sera modificar el Main de Program.cs de la siguiente forma:

        static void Main(string[] args)
        {
            Persona p1 = new Persona();
            Persona p2 = new Persona();
            p1.nombre = "Martin Miranda";
            p1.edad = 44;
            p2.nombre = "El Tinchicus";
            p2.edad = 33;
            Console.WriteLine(p1.nombre + " " + p1.edad);
            Console.Write(p2.nombre + " " + p2.edad);
        }
Anuncios

En este caso crearemos dos objetos de tipo Persona llamados p1 y p2, luego le asignaremos valores a los campos nombre y edad para p1 y p2, despues mostraremos los datos ingresados, compilemos y probemos como funciona nuestro programa:

C:\Users\tinchicus\Source\Repos\GetSet\GetSet\bin\Debug>GetSet.exe
Martin Miranda 44
El Tinchicus 33
C:\Users\tinchicus\Source\Repos\GetSet\GetSet\bin\Debug>
Anuncios

En esta salida vemos como funciona correctamente, pero supongamos que nuestro codigo de repente se modifica de la siguiente forma:

        static void Main(string[] args)
        {
            Persona p1 = new Persona();
            Persona p2 = new Persona();
            p1.nombre = "Martin Miranda";
            p1.edad = 44;
            p2.nombre = "El Tinchicus";
            p2.edad = 33;
            p1.edad = 0;
            p2.nombre = "";
            Console.WriteLine(p1.nombre + " " + p1.edad);
            Console.Write(p2.nombre + " " + p2.edad);
        }
Anuncios

En este caso le asignamos el valor 0 a la edad de p1 y un valor vacio para nombre en p2, si lo compilamos y probamos veremos la siguiente salida:

C:\Users\tinchicus\Source\Repos\GetSet\GetSet\bin\Debug>GetSet.exe
Martin Miranda 0
 33
C:\Users\tinchicus\Source\Repos\GetSet\GetSet\bin\Debug>
Anuncios

Como pueden ver se modifico nuestra informacion por error o no pero para evitar esto tenemos a disposicion una herramienta muy util como son Get y Set, para ello deberemos modificar las variables de la clase Persona de la siguiente forma:

namespace GetSet
{
    class Persona
    {
        private string _nombre;
        private int _edad;
        public string nombre
        {
            get
            {
                return _nombre;
            }
            set
            {
                if (!string.IsNullOrEmpty(value))
                {
                    _nombre = value;
                }
            }
        }        
        public int edad
        {
            get
            {
                return _edad;
            }
            set
            {
                if (value>0)
                {
                    _edad = value;
                }
            }
        }
    }
}
Anuncios

En este caso primero primero crearemos las dos variables temporales para manejar la informacion, las cuales son estas dos lineas:

        private string _nombre;
        private int _edad;
Anuncios

Nuestro siguiente paso sera modificar las dos variables que creamos al principio y para ello analizaremos a la primera de ellas:

        public string nombre
        {
            get
            {
                return _nombre;
            }
            set
            {
                if (!string.IsNullOrEmpty(value))
                {
                    _nombre = value;
                }
            }
        }
Anuncios

En este caso seguimos respetando lo que dijimos antes, creamos un bloque de llaves, en las cuales pondremos primero a get, un bloque de llaves y dentro usaremos la siguiente linea:

return _nombre;
Anuncios

Dado que el metodo get lo usaremos unicamente para recuperar el valor que esta almacenado temporalmente en _nombre pero podemos agregar mas instrucciones? si, aunque para nuestro ejemplo con esto, asi como en la vida real, alcanzara pero tengan en mente que pueden agregar mas instrucciones en caso de ser necesario, en cambio el metodo set usaremos el siguiente condicional if:

                if (!string.IsNullOrEmpty(value))
                {
                    _nombre = value;
                }
Anuncios

Este bloque es muy interesante porque primero chequearemos si el valor informado no es nulo (null) o vacio, en realidad el metodo de la clase string (isNullOrEmpty) verifica si es null o vacio pero como vimos en este post el operador ! invierte al metodo es decir que chequea si no esta vacio o tenga valor nulo, en caso de ser verdadero procede a asignar el contenido de value a _nombre, veamos el siguiente bloque:

        public int edad
        {
            get
            {
                return _edad;
            }
            set
            {
                if (value>0)
                {
                    _edad = value;
                }
            }
        }

En este caso aplicamos exactamente lo mismo a la variable edad, el get de esta variable hace lo mismo que el anterior pero en el set modificamos el condicional para que almacene solamente si edad es mayor a 0, de lo contrario lo ignora, y hace lo mismo, asignar el valor en value a _edad, si compilamos y probamos deberemos obtener el siguiente resultado:

C:\Users\tinchicus\Source\Repos\GetSet\GetSet\bin\Debug>GetSet.exe
Martin Miranda 44
El Tinchicus 33
C:\Users\tinchicus\Source\Repos\GetSet\GetSet\bin\Debug>
Anuncios

Como ven ahora nuestros valores estan protegidos de cualquier modificacion mal intencionada o no, evitando que nuestros programas generen un error o trabajen de forma incorrecta, y obviamente una mejor manera de proteger los valores que manejamos internamente.

Anuncios
Nota: el value que aparecio es parte de los campos o propiedades de las clases de los tipos, siempre que nuestras variables manejen un valor sera almacenado en este.
Anuncios

En resumen, hoy hemos visto getter and setter, que es, para que se usa, como es su sintaxis, los beneficios de usar la misma, un ejemplo practico, como nos beneficia y que nos optimiza en nuestros codigos, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

1.00 $