Поделиться через


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

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

В этом примере показан класс Person с двумя свойствами: Name (строка) и 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;
    }
}

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 - {person}");

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

        // Increment the Age property:
        person.Age += 1;
        Console.WriteLine($"Person details - {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;
    }
    private set
    {
        _name = value;
    }
}

Кроме того, вы можете предоставить один метод доступа публично, но сделать другой закрытый или защищенный. Дополнительные сведения см. в разделе «Асимметричный доступ аксессора».

После объявления свойств их можно использовать в качестве полей класса. Свойства позволяют использовать естественный синтаксис при получении и установке значения свойства, как в следующих инструкциях:

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 .

См. также