Внутреннее представление свойств в C#
Внутреннее представление свойств в C#
Многие программисты (особенно те, которые привыкли использовать C++) стремятся использовать традиционные префиксы get_ и set_ для методов чтения и модификации (например, get_FullName() и set_FullName()). Против самого соглашения возражений нет. Однако следует знать, что "за кадром" свойства в C# представляются программным кодом CIL, использующим такие же префиксы. Например, если открыть компоновочный блок Employees.exe с помощью ildasm.exe, вы увидите, что каждое свойство XXX на самом деле сводится к скрытым методам get_XXX()/set_XXX() (рис. 4.6).
Рис. 4.6. Отображение свойств XXX в скрытые методы get_XXX() и set_XXX()
Предположим теперь, что тип Employee имеет частный член-переменную с именем empSSN для представления номера социальной страховки работника. Эта переменная устанавливается через параметр конструктора, а для управления этой переменной используется свойство SocialSecurityNumber.
// Добавление поддержки нового поля, представляющего SSN-код.
public class Employee {
…
// Номер социальной страховки (SSN).
private string empSSN;
public Employes (string fullName, int age, int empID, float currPay, string ssn) {
…
this.empSSN = ssn;
}
public string SocialSecurityNumber {
get { return empSSN; }
set { empSSN = value; }
}
public void DisplayStats() {
…
Console.WriteLine("SSN: {0} ", empSSN);
}
}
Если бы вы также определили два метода get_SocialSecurityNumber() и set_SocialSecurityNumber(), то получили бы ошибки компиляции.
// Свойство в C# отображается в пару методов get_/set_.
public class Employee {
// ОШИБКА! Уже определены самим свойством!
public string get_SocialSecurityNumber() { return empSSN; }
public void set_SocialSecurityNumber(string val) { empSSN = val; }
}
Замечание. В библиотеках базовых классов .NET всегда отдается предпочтение свойствам типа (в сравнении с традиционными методами чтения и модификации). Поэтому, чтобы строить пользовательские типы, которые хорошо интегрируются с платформой .NET, следует избегать использования традиционных методов get и set.