Практическое руководство. Объявление и использование свойств чтения и записи (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

Свойства обеспечивают удобную работу с открытыми членами данных без риска, с которым связан незащищенный, неконтролируемый и непроверяемый доступ к данным объекта. Это достигается с помощью методов доступа: особых методов, которые назначают и извлекают значения из базового члена данных. Метод доступа set обеспечивает назначение членов данных, а метод get извлекает значения членов данных.

В этом примере показан простой класс Person, имеющий два свойства: Name(string) и Age (int). Оба свойства предоставляют методы доступа get и set, поэтому они считаются свойствами чтения и записи.

Пример

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;
    }
}

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
*/

Отказоустойчивость

В предыдущем примере свойства Name и Age являются открытыми и содержат методы доступа get и set. При этом любой объект может выполнять чтение и запись данных свойств. Однако иногда рекомендуется исключить один из методов доступа. Если, например, будет опущен метод доступа set, средство станет доступным только для чтения.

public string Name
{
    get
    {
        return name;
    }
}

Можно также сделать один метод доступа открытым, а другой — закрытым или защищенным. Дополнительные сведения см. в разделе Простота использования асимметричных методов доступа).

Объявленные свойства могут использоваться в качестве полей класса. Это приводит к более естественному синтаксису, где выполняется получение и установка значения свойства, как в следующих операторах.

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

Обратите внимание, что в свойстве метода set доступна особая переменная value. Эта переменная содержит значение, заданное пользователем, например:

name = value;

Обратите внимание на чистый синтаксис для увеличения значения свойства Age объекта Person.

person.Age += 1;

Если для моделирования свойств использовались отдельные методы set и get, эквивалентный код может выглядеть следующим образом.

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

В этом примере метод ToString переопределен.

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

Обратите внимание, что ToString не используется явно в программе. Он вызывается по умолчанию вызовами WriteLine.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Свойства (руководство по программированию в C#)

Классы и структуры (Руководство по программированию в C#)