Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
public class Triangle {
// Перегруженный метод Draw().
public void Draw(int x, int y, int height, int width) {…}
public void Draw(float x, float y, float height, float width) {…}
public void Draw(Point upperLeft, Point bottomRight) {…}
public void Draw(Rect r) {…}
}
Если бы в C# не поддерживалась перегрузка методов, вы были бы вынуждены создать четыре члена с уникальными именами, что, как можете убедиться, весьма далеко от идеала.
public class Triangle {
// Глупость…
public void DrawWithInts(int x, int y, int height, int width) {…}
public void DrawWithFloats(float x, float y, float height, float width) {…}
public void DrawWithPoints(Point upperLeft, Point bottomRight) {…}
public void DrawWithRect(Rect r) {…}
}
Но не забывайте о том, что при перегрузке члена возвращаемый тип не может быть независимым. Так, следующий вариант просто недопустим.
public class Triangle {
…
// Ошибка! Нельзя перегружать методы
// на основе возвращаемых значений!
public float GetX(){…}
public int GetX(){…}
}
Использование this для возвратных ссылок в C#
Обратите внимание на то, что другой конструктор класса Employee использует ключевое слово C# this.
// Явное использование "this" для разрешения конфликтов имен.
publiс Employee(string fullName, int empID, float currPay) {
// Присваивание входных параметров данным состояния.
this.fullName = fullName;
this.empID = empID;
this.currPay = currPay;
}
Это ключевое слово C# используется тогда, когда требуется явно сослаться на поля и члены текущего объекта. Причиной использования ключевого слова this в этом пользовательском конструкторе является стремление избежать конфликта имен параметров и внутренних переменных состояния. Альтернативой могло бы быть изменение имен всех параметров.
// В отсутствие конфликта имен "this" подразумевается.
public Employee(string name, int id, float pay) {
fullName = name;
empID = id;
currPay = pay;
}
В данном случае нет необходимости явно добавлять префикс this к именам членов-переменных Employee, потому что конфликт имен уже исключен. Компилятор может самостоятельно выяснить области видимости используемых членов-переменных, и в этой ситуации this называют неявным : если класс ссылается на свои собственные поля данных и члены-переменные (без каких бы то ни было неоднозначностей), то this подразумевается. Таким образом, предыдущая логика конструктора функционально идентична следующей.
public Employee(string name, int Id, float pay) {
this.fullName = name;
this.empID = id;
this.currPay = pay;
}
Замечание.Статические члены типа не могут использовать ключевое слово this в контексте метода. В этом есть смысл, поскольку статические члены-функции действуют на уровне класса (а не объекта). На уровне класса нет this!
Передача вызовов конструктора с помощью this
Другим вариантом использования ключевого слова this является такая реализация вызова одним конструктором другого, при которой не возникает избыточной логики инициализации члена. Рассмотрим следующую модификацию класса Employee.
public class Employee {
…
public Employee(string fullName, int empID, float currPay) {
this.fullName = fullName;
this.empID = empID;
this.currPay = currPay;
}
// Если пользователь вызовет этот конструктор, то
// передать вызов версии с тремя аргументами.
public Employee(string fullName) : this(fullName, IDGenerator.GetNewEmpID(), 0.0F) {}
…
}
Эта итерация класса Employee определяет два пользовательских конструктора, и второй из них имеет единственный параметр (имя индивидуума). Однако для построения полноценного нового Employee вы хотите гарантировать наличие соответствующего ID и значения зарплаты. Предположим, что у вас есть пользовательский класс (IDGenerator) со статическим методом GetNewEmpID(), тем или иным образом генерирующим ID нового работника. Собрав множество начальных параметров, вы передаете запрос создания объекта конструктору с тремя аргументами.
Если не передавать вызов, то придется добавить в каждый конструктор избыточный программный код.
// currPay автоматически приравнивается к 0.0F через значения,
// заданные по умолчанию.
public Employee(string fullName) {
this.fullName = fullName;
this.empID = IDGenerator.GetNewEmpID();
}
Следует понимать, что использование ключевого слова this для передачи вызовов конструктора не является обязательным. Однако при использовании этого подхода вы получаете более удобное и более краткое определение класса. Фактически, используя этот подход, вы можете упростить свои программистские задачи, поскольку реальная работа делегируется одному конструктору (обычно это конструктор, который имеет наибольшее число параметров), а остальные конструкторы просто перекладывают ответственность.
Определение открытого интерфейса класса
После создания данных внутреннего состояния класса и набора конструкторов следующим шагом должно быть определение деталей открытого интерфейса класса. Этим терминам обозначают множество членов, непосредственно доступных из объектной переменной через операцию, обозначаемую точкой.
С точки зрения построения класса открытый интерфейс формируют те элементы, которые объявлены в классе с использованием ключевого слова public. Кроме далей данных и конструкторов, открытый интерфейс класса может иметь множество других членов, включая следующие.
• Методы. Именованные единицы действия, моделирующие некоторые особенности поведения класса.
• Свойства. Традиционные функции чтения и модификации данных.
• Константы/поля только для чтения. Поля данных, которые не допускают изменения после присваивания им значений (см. главу 3).
Замечание. Из последующего материала данной главы вам станет ясно, что вложенные определения типа тоже могут появляться в рамках открытого интерфейса типа. К тому же , как будет показано в главе 8, открытый интерфейс класса может поддерживать и события.
С учетом того, что наш класс Employee определяет два открытых метода (GiveBonus() и DisplayStats()), мы имеем возможность взаимодействовать с открытым интерфейсом так, как показано ниже.
// Взаимодействие с открытым интерфейсом класса Employee.
static void Main(string[] args) {
Console.WriteLine("*** Тип Employee в процессе работы ***\n");
Employee e = new Employee("Джо", 80, 30000);
e.GiveBonus(20.0);
e.DisplayStats();
Employee e2;
e2 = new Employee("Бет", 81, 50000);
e2.GiveBonus(1000);
e2.DisplayStats();
Console.ReadLine();
Интервал:
Закладка: