Практическое руководство. Объявление и использование свойств чтения и записи (руководство по программированию на C#)
Свойства имеют все преимущества открытых членов данных, но не связаны с рисками незащищенного, неконтролируемого и несанкционированного доступа к данным объекта. Свойства объявляют методы доступа: специальные методы, которые назначают и извлекают значения из базового элемента данных. Метод доступа 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;
}
}
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
*/
Отказоустойчивость
В предыдущем примере свойства 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
.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по