// Ошибка! Длина имени превышает 15 символов!
}
else
{
_empName = value;
}
}
}
// Можно было бы добавить дополнительные бизнес-правила для установки
// данных свойств, но в настоящем примере в этом нет необходимости.
public int Id
{
get { return _empId; }
set { _empId = value; }
}
public float Pay
{
get { return _currPay; }
set { _currPay = value; }
}
...
}
Свойство C# состоит из определений областей get
set
(метод изменения) прямо внутри самого свойства. Обратите внимание, что свойство указывает тип инкапсулируемых им данных способом, который выглядит как возвращаемое значение. Кроме того, в отличие от метода при определении свойства не применяются круглые скобки (даже пустые). Взгляните на следующий комментарий к текущему свойству Id
:// int представляет тип данных, инкапсулируемых этим свойством.
public int Id // Обратите внимание на отсутствие круглых скобок.
{
get { return _empId; }
set { _empID = value; }
}
В области видимости set
value
, которая представляет входное значение, присваиваемое свойству вызывающим кодом. Лексема value
value
находится внутри области set
, она всегда обозначает значение, присваиваемое вызывающим кодом, и всегда имеет тип, совпадающий с типом самого свойства. Таким образом, вот как свойство Name
может проверить допустимую длину строки:public string Name
{
get { return _empName; }
set
{
// Здесь value на самом деле имеет тип string.
if (value.Length > 15)
{ Console.WriteLine("Error! Name length exceeds 15 characters!");
// Ошибка! Длина имени превышает 15 символов!
}
else
{
empName = value;
}
}
}
После определения свойств подобного рода вызывающему коду кажется, что он имеет дело с
get
или set
, предохраняя инкапсуляцию:Console.WriteLine("***** Fun with Encapsulation *****\n");
Employee emp = new Employee("Marvin", 456, 30000);
emp.GiveBonus(1000);
emp.DisplayStats();
// Переустановка и аатем получение свойства Name.
emp.Name = "Marv";
Console.WriteLine("Employee is named: {0}", emp.Name); // имя сотрудника
Console.ReadLine();
Свойства (как противоположность методам доступа и изменения) также облегчают манипулирование типами, поскольку способны реагировать на внутренние операции С#. В целях иллюстрации будем считать, что тип класса Employee
class Employee
{
...
// Новое поле и свойство.
private int _empAge;
public int Age
{
get { return _empAge; }
set { _empAge = value; }
}
// Обновленные конструкторы.
public Employee() {}
public Employee(string name, int id, float pay)
:this(name, 0, id, pay){}
public Employee(string name, int age, int id, float pay)
{
_empName = name;
_empId = id;
_empAge = age;
_currPay = pay;
}
// Обновленный метод DisplayStats() теперь учитывает возраст.
public void DisplayStats()
{
Console.WriteLine("Name: {0}", _empName); // имя сотрудника
Console.WriteLine("ID: {0}", _empId);
// идентификационный номер сотрудника