Свойства

Поля для чтения 10 24 42

Вызов конструкторов из других конструкторов.

Поля для чтения 10 24 37

 

 

Вопросы:

 

1. Сколько и каких статических конструкторов может быть объявлено в классе?

2. Какую спецификацию доступа может иметь статический конструктор?

3. Как вызывается статический конструктор?

4. Чем отличаются конструкторы с аргументами от конструкторов по умолчанию?

5. Как инициализируются поля только для чтения?

6. Чем отличаются константы от полей только для чтения?

7. Сколько конструкторов с аргументами может быть объявлено в классе?

8. Сколько конструкторов по умолчанию может быть объявлено в классе?

 


Очень часто разные конструкторы независимо друг от друга содержат один и тот же код. Может сложиться ситуация, когда код одного конструктора будет изменен, а соответствующие изменения в тело другого конструктора, по рассеянности, внесены не будут. Для исключения подобной ситуации рекомендуется, для выполнения совпадающего кода осуществлять вызов конструкторов из других конструкторов. Для этого после имени конструктора указывается, через двоеточие, ключевое слово this со списком передаваемых параметров.

 

public CA(int a,int b,int c):this(a,b)

{

z=c;

rd=x+y+z;

}

 

При вызове конструкторов из других конструкторов, может быть вызван только один конструктор, который всегда выполняется первым.

 

Пример:

using System;

 

namespace ConsoleApplication15

{

 

class CA

{

public int x,y,z;

public readonly int rd;

public CA()

{

x=3;

y=2;

z=x+y;

rd=x+y+z;

 

}

public CA(int a,int b)

{

x=a;

y=b;

z=a+b;

rd=x+y+z;

 

}

public CA(int a,int b,int c):this(a,b)

{

z=c;

rd=x+y+z;

}

 

}

class Class1

{

[STAThread]

static void Main(string[] args)

{

CA obj=new CA();

Console.WriteLine("x={0,2} y={1,2}

z={2,2}",obj.x,obj.y,obj.z);

CA obj1=new CA(5,7);

Console.WriteLine("x={0,2} y={1,2}

z={2,2}",obj1.x,obj1.y,obj1.z);

CA obj2=new CA(8,9,25);

Console.WriteLine("x={0,2} y={1,2}

z={2,2}",obj2.x,obj2.y,obj2.z);

Console.WriteLine("поля для чтения {0,2} {1,2}

{2,2}",obj.rd,obj1.rd,obj2.rd);

}

}

}

Результат выполнения

x = 3 y = 2 z = 5

x = 5 y = 7 z =12

x = 8 y = 9 z =25

Конструкторы в C# могут быть объявлены с модификаторами private и protected. Такие конструкторы могут быть вызваны только из других конструкторов этого же класса.

 

Согласно принципам ООП должен быть запрещен прямой доступ к полям класса, то есть поля класса должны быть объявлены со спецификацией private или protected. Корректную работу с полями класса должны обеспечивать открытые методы, определяющие правила доступа к полям класса.

В С# для этих целей определены специальные методы, называемые свойствами.

Свойства предназначены для облегчения организации доступа к закрытым и защищенным полям класса. Свойство содержит два метода – аксессоры. Эти методы - аксессоры называются получатель (get) и установщик (set). Именно они должны выполнять работу по установке и получению значений полей класса, по правилам, определенным для объекта, поведение которого описывается классом

Свойства – это методы класса, обращение к которым внешне похоже на обращение к полю класса, поэтому их часто называют интеллектуальным полем.

В ниже следующем примере свойство с именем y обеспечивает доступ к полю классаz.

 

Пример:

class CA

{

private int z;

public int y

{

get

{

return z;

}

set

{

z = value;

}

}

}

 


class Class1

{

[STAThread]

static void Main(string[] args)

{

CA a = new CA();

a.y = 5; //z=5;

int m = a.y;//m=5;

Console.WriteLine("m="+m);

}

 

}

}

 

Свойство, определяется, так же как и поле, но после имени свойства идет блок кода, включающий в себя два метода get и set. Код этих методов может быть сколь угодно сложным, но в нашем примере это всего лишь один оператор. Аксессор get всегда возвращает значение того типа, который указан в определении свойства. Аксессор set всегда принимает в качестве параметра переменную value, которая передается ему неявно. Один из аксессоров может быть опущен, в этом случае мы получаем поле только для чтения или только для записи.