Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 68

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 62 63 64 65 66 67 < 68 > 69 70 71 72 73 74 .. 320 >> Следующая

152 Глава 3 • С# и объектно-ориентированное программирование
// Обращение к имени сотрудника через свойство public static int Main(string[] args)
(
Employee p new Employee^;
//Устанавливаем значение p.EmplD - 81;
II Получаен значение
Console.WriteLinet"Person ID is: {0}". p.EmplD): return 0;
|
Если заглянуть внутрь определения класса, то свойства всегда отображаются в «реальные* методы доступа и изменения. А уже в определении этих методов вы можете реализовать любую логику (например, для устранения лишних символов, проверки допустимости вводимых числовых значений и прочего). Ниже представлен синтаксис класса Employee с определением свойства EmplD:
// Пользовательское свойство EmplD для доступа к переменной empID
public class Employee
{
private етрШ:
// Свойство для еж10 public int EmplD {
get (return emplD:}
set
{
Il Здесв вы иожете реализовать логику для проверки вводимых // значений и выполнения других действий emplD - value;
} .
)
}
Свойство С# состоит из двух блоков - блока доступа (get block) и блока изменения (set block). Ключевое слово val ue представляет правую часть выражения при присвоении значения посредством свойства. Как и все в С#, то, что представлено словом val ue - это также объект. Совместимость того, что передается свойству как value, с самим свойством, зависит от определения свойства. Например, свойство EmpID предназначено (согласно своему определению в классе) для работы с закрытым целочисленным empID, поэтому число 81 вполне его устроит:
// В данной случае типом данных, используемым для value, будет int еЗ.EmpID - 81:
Показать дополнительные возможности применения ключевого слова value можно на таком примере:
Свойство
public int EmplD {
get {return empID:}
set
(
Средства инкапсуляции в С# 153
Результат работы данной программы представлен рис. 3.7.
¦ і D:\CShatpBook\Labs\Chapter 3\tmploye„
value is an instance of :1111..32 value as string =H1 Press any lie у to continue
LL
Рис. 3.7. Значение «value» при ЕтрЮ = 81
Необходимо отметить, что обращаться к объекту можно только в пределах программного блока set внутри определения свойства. Попытка обратиться к этому объекту из любого другого места приведет к ошибке компилятора.
Последнее, что мы отметим — использование свойств (по сравнению с традиционными методами доступа и изменения) делает применение ваших типов более простым. Например, предположим, что в классе Employee предусмотрена внутренняя закрытая переменная для хранения информации о возрасте сотрудника. Вы хотите, чтобы при наступлении дня рождения этого сотрудника значение этой переменной увеличивалось на единицу. При использовании традиционных методов доступа и изменения эта операция будет выглядеть так:
Employee joe - new Employee О: joe.SetAge( joe.GetAgeu + 1):
Используя свойство, вы можете сделать
Employee joe - new EmployeeO; joe.Aget+:
проще:
Внутреннее представление свойств С#
Многие программисты стараются использовать для имен методов доступа и шмс -нения соответственно приставки get_ и set_ (например, get Named и set_Name(}"). ¦Само по себе это не представляет проблемы. Проблему представляет другое: С# для внутреннего представления свойства использует методы с теми же самыми префиксами. К примеру, если вы откроете сборку EmpLoyees.exe при помощи утилиты ILDastn.exe, выувидите, что каждому свойству соответствуютдва отдельных
(и скрытых) метода (рис. 3.8).
Поэтому подобное определение класса вызовет ошибку компилятора:
// Помните, что свойство CJ автоматически отображается в пару методов get/set
public class Employee t
ни*;
// Как еще можно использовать value
Console.WriteLineCvalue is the Instance of: {0}", value.GetTypeO): Ccnssle.WrlteLinsCvalue as string: {0}". value.ToSlringO): ernpID = value;
154 Глава 3
С# и объектно-ориентированное программирование
// Определение ПшЙКТОй public string SSN
1
get { return ssn; j // Отображается в get_SSN() set ( ssn = value; } // Отображается в set SSNC)
}
//Ошибка! Эти методы уже определены через свойство SSN!
public string get_SSN() { return ssn: }
public String set SSNCstring val) { ssn = val; }
Свойство автоматически отображается в два метода, но обратное утверждение не будет верным. Если вы создадите два метода get_X() и S9t_X( j, свойство X автоматически создано не будет:
// Считаем, что в классе Foo определены два метода - get_X() и set_X(), // а свойство X не определено Foo f = FOOO:
f.X - 100; // Ошибка! X необходимо явно определить как свойство CJ
Console.WriteLinet f.X); // Ошибка - по той же самой причине
/ D:\C5harpBaok\Labs\Chapter 3\E<npk)._ И НЕЇ
Efe fcielp
V D:\CShaipBook\Labs\Chaptei 34Employees4bin\D вЩ Employees
Я pi EmpApp
H f Employee
¦ ft .ctosscU* abstract auto arai
CompNarr» : private static class System! V FullName : family class System.String if -V currPay ; femiry float32 V emplD : family int32 ¦ V ssn: Family dass System.S lring El cclor: voicffi
,ctor:vo!d
M ,clor: void(classSysLem.SrTing,int32.fl«i S Oispleysids ; voidO -В GetFullName: class System. String!) • • GiveB onus : void|flosL32) • SsiFJlN-ame- void(rbss Syslsm. String) El get_Company: dass System.SlringQ
Предыдущая << 1 .. 62 63 64 65 66 67 < 68 > 69 70 71 72 73 74 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100