ProgBasics_lec05-6_class_members
.pdfusage
Button okButton = new Button(); okButton.Caption = "OK"; // Invokes set accessor string s = okButton.Caption; // Invokes get accessor
Автоматические свойства
•Можно не объявлять поле вручную – это сделает компилятор
•Можно нарушить инкапсуляцию
Возможный компромисс
public string Name
{
get; private set;
}
Модификаторы доступа
public – элемент виден везде
internal - элемент виден в пределах сборки
protected internal – элемент видел в пределах сборки или наследникам в другой
protected – элемент виден потомкам (1 уровень иерархии)
private – элемент виден внутри типа, в котором описан
static & instance members
instance members – экземплярные элементы класса – принадлежат объекту (экземпляру класса, instance)
static members – статические элементы – принадлежат классу (общие для всех экземпляров этого класса, если создать экземпляр возможно)
•Все элементы типов по-умолчанию – instance
•Чтобы объявить static-элемент, необходимо использовать модификатор static.
•Обращаться к static-элементам можно, используя имя типа: например, класс E, в нём
M – static-свойство. Usage: E.M;
•static-поле (non-generic!) хранится всегда в одном месте в памяти
•Нельзя из static-методов обращаться к экземплярным элементам (по ссылке this).
static-конструкторы
•могут быть только private
•могут быть external
•нельзя вызвать вручную
•в общем случае срабатывают
–перед первым обращением к статическому элементу
–перед созданием экземпляра класса
instance members
•Доступ осуществляется обращением к объекту (instance), для класса которого определён элемент.
•Каждый экземпляр класса содержит свой набор полей.
•Instance-элементы могут быть доступны при помощи this, из тела instance-метода можно обратиться к static-элементу.
class Test
{
int x; static int y; void F()
{
x = 1; // Ok, this.x = 1 y = 1; // Ok, Test.y = 1
}
static void G()
{
x = 1; // Error, cannot access this.x y = 1; // Ok, same as Test.y = 1
}
static void Main()
{
Test t = new Test(); t.x = 1; // Ok
t.y = 1; // Error, cannot access static member through instance Test.x = 1; // Error, cannot access instance member through type Test.y = 1; // Ok
}
}