Console.WriteLine("Pay: {0}", Pay); // текущая выплата
}
// Свойства остаются прежними...
...
}
Свойства, допускающие только чтение
При инкапсуляции данных может возникнуть желание сконфигурировать set. Например, пусть имеется новое свойство по имени SocialSecurityNumber, которое инкапсулирует закрытую строковую переменную empSSN. Вот как превратить его в свойство, доступное только для чтения:
public string SocialSecurityNumber
{
get { return _empSSN; }
}
Свойства, которые имеют только метод get, можно упростить с использованием членов, сжатых до выражений. Следующая строка эквивалентна предыдущему блоку кода:
public string SocialSecurityNumber => _empSSN;
Теперь предположим, что конструктор класса принимает новый параметр, который дает возможность указывать в вызывающем коде номер карточки социального страхования для объекта, представляющего сотрудника. Поскольку свойство SocialSecurityNumber допускает только чтение, устанавливать значение так, как показано ниже, нельзя:
public Employee(string name, int age, int id, float pay, string ssn)
{
Name = name;
Age = age;
ID = id;
Pay = pay;
// Если свойство предназначено только для чтения, это больше невозможно!
SocialSecurityNumber = ssn;
}
Если только вы не готовы переделать данное свойство в поддерживающее чтение и запись (что вскоре будет сделано), тогда единственным вариантом со свойствами, допускающими только чтение, будет применение лежащей в основе переменной-члена empSSN внутри логики конструктора:
public Employee(string name, int age, int id, float pay, string ssn)
{
...
// Проверить надлежащим образом входной параметр ssn
// и затем установить значение.
empSSN = ssn;
}
Свойства, допускающие только запись
Если вы хотите сконфигурировать get, например:
public int Id
{
set { _empId = value; }
}
Смешивание закрытых и открытых методов get/set в свойствах
При определении свойств уровень доступа для методов get и set может быть разным. Возвращаясь к номеру карточки социального страхования, если цель заключается в том, чтобы предотвратить модификацию номера get как открытый, но метод set — как закрытый:
public string SocialSecurityNumber
{
get => _empSSN;
private set => _empSSN = value;
}
Обратите внимание, что это превращает свойство, допускающее только чтение, в допускающее чтение и запись. Отличие в том, что запись скрыта от чего-либо за рамками определяющего класса.
Еще раз о ключевом слове static: определение статических свойств
Ранее в главе рассказывалось о роли ключевого слова static. Теперь, когда вы научились использовать синтаксис свойств С#, мы можем формализовать статические свойства. В проекте StaticDataAndMembers класс SavingsAccount имел два открытых статических метода для получения и установки процентной ставки. Однако более стандартный подход предусматривает помещение такого элемента данных в статическое свойство. Ниже приведен пример (обратите внимание на применение ключевого слова static):
// Простой класс депозитного счета.
class SavingsAccount
{
// Данные уровня экземпляра.
public double currBalance;
// Статический элемент данных.
private static double _currInterestRate = 0.04;
// Статическое свойство.
public static double InterestRate
{
get { return _currInterestRate; }
set { _currInterestRate = value; }
}
...
}
Если вы хотите использовать свойство InterestRate вместо предыдущих статических методов, тогда можете модифицировать свой код следующим образом:
// Вывести текущую процентную ставку через свойство.