Практическое руководство. Объявление и использование свойств чтения и записи (Руководство по программированию в 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#