Классы в C# могут содержать и такие
элементы, как свойства. Эти члены являются
очень важными и довольно часто
используются. По сути, свойства - это данные,
отображающие какие-либо особенности, опции,
а лучше их смысл понимать дословно. Если вы
хотите стать программистом .Net, вы обязаны
знать этот механизм и владеть им в
совершенстве. Но и тут не надо иметь семи
пядей во лбу, как всегда, все очень просто.
Свойство - это динамическое поле, для
которого определены методы доступа, обычно
они объявляются с модификатором доступа
public, т.е. открытыми, т.к. обычно свойства
изменяются вне объекта. Свойства
целесообразно использовать вместо обычных
переменных там, где, в соответствии со
значением переменной, должны изменять свое
значение и другие члены класса. Т.е.,
благодаря свойствам, нам не придется
переписывать код изменения заново, или, что
еще хуже, повторно вызывать конструкторы.
Внешне синтаксис свойств похож на
синтаксис индексаторов. Используются
методы доступа с такими же именами, точно
так же без аргументов. Общий вид:
public тип имя
{
get
{возврат_значения;}
set
{проверка;
установка_значения;
обновление_других_членов;
}
}
И, наконец, маленький примерчик
рационального использования свойств.
Определим свойство IsBoxed логического типа
для класса, описывающего проц.
using Sc=System.Console;
class CPU
{
private string name;
private int freq;
private bool isboxed;
private bool needcooler;
public CPU(string n,int f)
{
name=n;
freq=f;
}
public bool IsBoxed
{
get{return isboxed;}
set
{
isboxed=value;
if(value==true) needcooler=false;
else needcooler=true;
}
}
public void Print()
{
Sc.WriteLine("This is "+name);
Sc.WriteLine("Frequency is "+freq);
if(needcooler==true)
Sc.WriteLine("It needs a cooler!");
else Sc.WriteLine("It is boxed.");
}
}
class Application
{
public static void Main()
{
CPU Pentium=new CPU("Pentium",2000);
CPU Athlon=new CPU("Athlon",2000);
Pentium.IsBoxed=true;
Athlon.IsBoxed=false;
Sc.WriteLine("The first CPU:");
Pentium.Print();
Sc.WriteLine();
Sc.WriteLine("The second CPU:");
Athlon.Print();
Sc.ReadLine();
}
}
Я хочу остановиться на следующем моменте
-> мы определили закрытый член-переменную
isboxed и открытое свойство IsBoxed. Так вот, в isboxed
хранится значение, определяющее тип
упаковки проца, в то время, как свойство IsBoxed
работает с этой переменной и с некоторыми
другими по надобности. В этом примере мы
определили конструктор с двумя параметрами,
т.е. конструктор, устанавливающий значения
двух перменных-членов, а остальные
инициализируются при установке значения
свойства. Такой прием носит название
отложенной инициализации и имеет немалое
значение в оптимизации.