Propiedades.

En la sección de atributos estudiamos que, basándonos en el ejemplo de la clase 'Account', habíamos declarado como atributos el nombre, el número, el saldo y el tipo de interés. Podríamos hacer lo mismo con estas características de la clase si en lugar de declararlos como atributos los declaramos como propiedades. Y más allá, podríamos declarar una propiedad por cada atributo que controlara el valor de su propio atributo. Vamos con un ejemplo:

class Account
{
    private string name;
    private string accountNumber;
    private double balance;
    private double rate;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            if value.Length == 0)
            {
                System.Console.WriteLine("Error: cadena vacía.");
                return;
            }
            nombre = value;
        }
    }
}

Como ves, hay una propiedad 'Name' relacionada con su atributo 'name'. Esta propiedad 'Name' especifica el comportamiento del atributo 'name' en el momento de asignarle un valor. Dentro de la declaración de la propiedad, en el bloque 'get', sinplemente se dice que retorne el valor del atributo name. Hasta ahí todo sencillo. Sin embargo, en el bloque 'set', se especifica que, en el caso de que se agigne a 'name' un valor cuya longitud de la cadena sea igual a cero, en ese caso se nos avisará mediante un mensaje en la consola de que la cadena del nombre está vacía, y retornará la ejecución sin asignar al atributo 'name' ningún valor. Sin embargo, si la cadena del nombre sí es una cadena válida, entonces saltará el bloque 'if' y directamente asignará el nuevo valor al atributo 'name'. De esta manera, hemos hecho uso de una propiedad para realizar una validación del valor de la cadena del nombre y evitar que se introducjera un valor nulo en el atributo 'name'.

Si has sido observador, hemos declaradoo la propiedad con el modificador de acceso 'public'. De esta manera, desde otra clase o desde el método 'Main' principal del programa, podremos modificar el valor del atributo 'name' de la clase 'Account'. Así pues, no tiene mucho sentido declarar una propiedad como 'private', sino como 'public' para poder acceder a ella desde fuera de la clase y así poder interactuar y modificar los tributos de esa clase desde fuera de ella.

Propiedades autoimplementadas.

En algunos casos no será necesario código fuente que especifique el comportamiento de una propiedad y solamente será necesaria la declaración de la misma. De esta manera actuaría de forma normal a la hora de asignar y recuperar el valor de su atributo. En este caso estaríamos hablando de una propiedad autoimplementada:

public string Name
{
    get
    {
        return name;
    }
    set
    {
        name = value;
    }
}

O lo que es lo mismo:

public string Name
{
    get;
    set;
}

Acceso a las propiedades de una clase.

¿Deseamos acceder a las propiedades de una clase y, de manera indirecta, a sus atributos? Apliquemos lo estudiado tomando el siguiente código:

public class Program
{
    public static void Main()
    {
        Account account1 = new Account();
        account1.Name = "Zipi";
        Account account2 = new Account();
        account1.Name = "Zape";
        System.Console.WriteLine(account1.Name);
        System.Console.WriteLine(account2.Name);
        System.Console.ReadKey();
    }
}
public class Account
{
    private string name;
    public string Name
    {
        get;
        set;
    }
}

Al compilar y ejecutar el programa observa que la salida por la consola son dos resultados, 'Zipi' y 'Zape'. ¿Qué ha pasado? Pues que hemos creado dos instancias (dos objetos) de la clase 'Account', y mediante el acceso 'public' a sus propiedades, hemos modificado sus atributos 'name'. Al ordenar escribir en la consola el valor del atributo 'name', primero lo hemos hecho sobre la instancia (objeto) 'account1' y luego sobre la instancia (objeto) 'account2'. Como vemos, son dos instancias creadas a través del mismo molde (misma clase 'Account') pero son dos instancias diferentes e independientes entre sí. Podremos crear tantas instancias de la clase 'Account' como queramos, y cada una de ellas tendrá el comportmiento que deseemos de manera independiente.