Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// Синтаксис установки/чтения значения ID работника.
static void Main(string[] args) {
Employee p = new Employee();
// Установка значения.
p. ID= 81;
// Чтение значения.
Console.WriteLine ("ID работника: {0} ", p. ID); Console.ReadLine();
}
Свойства типа "за кадром" всегда отображаются в "настоящие" методы чтения и модификации. Поэтому, как разработчик класса, вы имеете возможность реализовать любую внутреннюю логику, выполняемую перед присваиванием соответствующего значения (например, перевод символов в верхний регистр, очистку значения от недопустимых символов, проверку принадлежности числового значения диапазону допустимости и т.д.). Ниже демонстрируется синтаксис C#. использующий, кроме свойства ID, свойство Pay (оплата), которое инкапсулирует поле currPay, a также свойство Name (имя), которое инкапсулирует данные fullName.
// Инкапсуляция с помощью свойств.
public class Employee {
...
private int empID;
private float currPay;
private string fullName;
// Свойство для empID.
public int ID {
get{return empID;}
set{
// Вы можете проверить и, если требуется, модифицировать
// поступившее значение перед присваиванием.
empID = value;
}
}
// Свойство для fullName.
public string Name {
get { return fullName; }
set { fullName = value; }
}
// Свойство для currPay.
public float Pay {
get { return currPay; }
set { currPay = value; }
}
}
Свойство в C# компонуется из блока чтения и блока модификации (установки) значении. Ярлык value в C# представляет правую сторону оператора присваивания. Соответствующий ярлыку value тип данных зависит от того, какого сорта данные этот ярлык представляет. В данном примере свойство ID оперирует с типом данных int, который, как вы знаете, отображается в System.Int32.
// 81 принадлежит System.Int32,
// поэтому "значением" является System.Int32.
Employee e = new Employee();
e.ID= 81;
Чтобы это доказать, предположим, что вы добавили следующий программный код для установки свойства ID.
// Свойство для empID.
public int ID {
get {return empID;}
set {
Console.WriteLine("value является экземпляром {0} ", value. GetType());
Console.WriteLine("Значение value: {0} ", value); empID = value;
}
}
Выполнив приложение, вы должны увидеть вариант вывода, показанный на рис. 4.5.

Рис. 4.5. Значение value после установки для ID значения 81
Замечание. Строго говоря, ярлык value в C# является не ключевым оловом, а, скорее, контекстным ключевым словом, представляющим неявный параметр, который используется в операторе присваивания в контексте метода, используемого для установки значения свойства. Поэтому вполне допустимо иметь члены-переменные и локальные элементы данных с именем value.
Следует понимать, что свойства (в отличие от традиционных методов чтения и модификации) еще и упрощают работу с типами, поскольку свойства способны "реагировать" на внутренние операции в C#. Например, предположим, что тип класса Employee имеет внутренний приватный член, представляющий значение возраста работника. Вот соответствующая модификация класса.
public class Employee {
…
// Текущий возраст работника.
private int empAge;
public Employee(string fullName, int age,int empID, float currPay) {
…
this.empAge= age;
}
public int Age {
get { return empAge; }
set { empAge = value; }
}
public void DisplayStats() {
…
Console.WriteLine("Возраст: {0}", empAge);
}
}
Теперь предположим, что вы создали объект Employee с именем joe. Вы хотите, чтобы в день рождения работника значение переменной возраста увеличивалось на единицу. Используя традиционные методы чтения и модификации, вы должны применить, например, следующий программный код.
Employee joe = new Employee();
joe. SetAge(joe. GetAge() + 1);
Но если инкапсулировать empAge, используя "правильный" синтаксис, вы сможете просто написать:
Employee joe = new Employee();
joe. Age++;
Внутреннее представление свойств в 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.
Контекст операторов get и set для свойств
Интервал:
Закладка: