Procedimiento para declarar y usar propiedades de lectura y escritura (Guía de programación de C#)

Las propiedades proporcionan la comodidad de los miembros de datos públicos sin los riesgos que provienen del acceso sin comprobar, sin controlar y sin proteger a los datos de un objeto. Las propiedades declaran los descriptores de acceso: métodos especiales que asignan y recuperan valores del miembro de datos subyacente. El descriptor de acceso set permite que los miembros de datos se asignen, y el descriptor de acceso get recupera los valores de los miembros de datos.

En este ejemplo se muestra una clase Person que tiene dos propiedades: Name (string) y Age (int). Ambas propiedades proporcionan descriptores de acceso get y set, de manera que se consideran propiedades de lectura y escritura.

Ejemplo

class Person
{
    private string _name = "N/A";
    private int _age = 0;

    // Declare a Name property of type string:
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    // Declare an Age property of type int:
    public int Age
    {
        get
        {
            return _age;
        }

        set
        {
            _age = value;
        }
    }

    public override string ToString()
    {
        return "Name = " + Name + ", Age = " + Age;
    }
}

public class Wrapper
{
    private string _name = "N/A";
    public string Name
    {
        get
        {
            return _name;
        }
        private set
        {
            _name = value;
        }
    }

}

class TestPerson
{
    static void Main()
    {
        // Create a new Person object:
        Person person = new Person();

        // Print out the name and the age associated with the person:
        Console.WriteLine("Person details - {0}", person);

        // Set some values on the person object:
        person.Name = "Joe";
        person.Age = 99;
        Console.WriteLine("Person details - {0}", person);

        // Increment the Age property:
        person.Age += 1;
        Console.WriteLine("Person details - {0}", person);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Person details - Name = N/A, Age = 0
    Person details - Name = Joe, Age = 99
    Person details - Name = Joe, Age = 100
*/

Programación sólida

En el ejemplo anterior, las propiedades Name y Age son públicas e incluyen un descriptor de acceso get y set. Los descriptores de acceso públicos permiten que cualquier objeto lea y escriba estas propiedades. En cambio, a veces esto es conveniente para excluir uno de los descriptores de acceso. Puede omitir el descriptor de acceso set para que la propiedad sea de solo lectura:

public string Name
{
    get
    {
        return _name;
    }
    private set
    {
        _name = value;
    }
}

De manera alternativa, puede exponer un descriptor de acceso públicamente pero hacer que el otro sea privado o esté protegido. Para obtener más información, vea Accesibilidad del descriptor de acceso asimétrico.

Una vez que se declaren las propiedades, pueden usarse como campos de la clase. Las propiedades permiten una sintaxis natural cuando ambos obtienen y establecen el valor de una propiedad, como se muestra en las instrucciones siguientes:

person.Name = "Joe";
person.Age = 99;

En un método set de la propiedad está disponible una variable value especial. Esta variable contiene el valor que el usuario ha especificado, por ejemplo:

_name = value;

Tenga en cuenta la sintaxis pura para incrementar la propiedad Age en un objeto Person:

person.Age += 1;

Si los métodos set y get independientes se han usado para modelar las propiedades, el código equivalente puede tener este aspecto:

person.SetAge(person.GetAge() + 1);

El método ToString se invalida en este ejemplo:

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

Tenga en cuenta que ToString no se usa explícitamente en el programa. Se invoca de manera predeterminada mediante las llamadas a WriteLine.

Consulte también