Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
имя_конструктора{список_параметров1) : this ( список_параметров2) {
// ... Тело конструктора, которое может быть пустым.
}
В исходном конструкторе сначала выполняется перегружаемый конструктор, список параметров которого соответствует критерию список_параметров2, а затем все остальные операторы, если таковые имеются в исходном конструкторе. Ниже приведен соответствующий пример.
// Продемонстрировать вызов конструктора с помощью ключевого слова this.
using System;
class XYCoord {
public int x, y;
public XYCoord() : this(0, 0) {
Console.WriteLine("В конструкторе XYCoord()");
}
public XYCoord(XYCoord obj) : this(obj.x, obj.y) {
Console.WriteLine("В конструкторе XYCoord(obj)");
}
public XYCoord(int i, int j) {
Console.WriteLine("В конструкторе XYCoord(int, int)"); x = i;
y = j;
}
}
class OverloadConsDemo {
static void Main() {
XYCoord tl = new XYCoord();
XYCoord t2 = new XYCoord(8, 9);
XYCoord t3 = new XYCoord(t2);
Console.WriteLine("tl.x,
tl.y:
" +
tl.x
+
", " +
tl.y);
Console.WriteLine("t2.x,
t2.y:
" +
t2.x
+
", " +
t2.y);
Console.WriteLine("t3.x,
t3.y:
" +
t3.x
+
", " +
t3.y);
}
}
Выполнение этого кода приводит к следующему результату.
В конструкторе XYCoord(int, int)
В конструкторе XYCoord()
В конструкторе XYCoord(int, int)
В конструкторе XYCoord(int, int)
В конструкторе XYCoord(obj)
tl.x, tl.y: 0, 0
t2.x, t2.у: 8, 9
t3.x, t3.у: 8, 9
Код в приведенном выше примере работает следующим образом. Единственным конструктором, фактически инициализирующим поля х и у в классе XYCoord
, является конструктор XYCoord(int, int).
А два других конструктора просто вызывают этот конструктор с помощью ключевого слова this
. Например, когда создается объект t1, то вызывается его конструктор XYCoord(),
что приводит к вызову this(0, 0),
который в данном случае преобразуется в вызов конструктора XYCoord(0, 0)
. То же самое происходит и при создании объекта t2.
Вызывать перегружаемый конструктор с помощью ключевого слова this
полезно, в частности, потому, что он позволяет исключить ненужное дублирование кода. В приведенном выше примере нет никакой необходимости дублировать во всех трех конструкторах одну и ту же последовательность инициализации, и благодаря применению ключевого слова this
такое дублирование исключается. Другое преимущество организации подобного вызова перезагружаемого конструктора заключается в возможности создавать конструкторы с задаваемыми "по умолчанию" аргументами, когда эти аргументы не указаны явно. Ниже приведен пример создания еще одного конструктора XYCoord
.
public XYCoord(int х) : this(х, х) { }
По умолчанию в этом конструкторе для координаты у автоматически устанавливается то же значение, что и для координаты у. Конечно, пользоваться такими конструкциями с задаваемыми "по умолчанию" аргументами следует благоразумно и осторожно, чтобы не ввести в заблуждение пользователей классов.
Инициализаторы объектов
Инициализаторы объектов предоставляют еще один способ создания объекта и инициализации его полей и свойств. (Подробнее о свойствах речь пойдет в главе 10.) Если используются инициализаторы объектов, то вместо обычного вызова конструктора класса указываются имена полей или свойств, инициализируемых первоначально задаваемым значением. Следовательно, синтаксис инициализатора объекта предоставляет альтернативу явному вызову конструктора класса. Синтаксис инициализатора объекта используется главным образом при создании анонимных типов в LINQ-выражениях. (Подробнее об анонимных типах и LINQ-выражениях — в главе 19.) Но поскольку инициализаторы объектов можно, а иногда и должно использовать в именованном классе, то ниже представлены основные положения об инициализации объектов.
Обратимся сначала к простому примеру.
// Простой пример, демонстрирующий применение инициализаторов объектов.
using System;
class MyClass {
public int Count;
public string Str;
}
class ObjInitDemo {
static void Main() {
// Сконструировать объект типа MyClass, используя инициализаторы объектов.
MyClass obj = new MyClass {
Count = 100, Str = "Тестирование"
};
Console.WriteLine(obj.Count + " " + obj.Str);
}
}
Выполнение этого кода дает следующий результат.
100 Тестирование
Как показывает результат выполнения приведенного выше кода, переменная экземпляра obj.Count
инициализирована значением 100, а переменная экземпляра obj.Str
— символьной строкой "Тестирование". Но обратите внимание на то, что в классе MyClass
отсутствуют явно определяемые конструкторы и не используется обычный синтаксис конструкторов. Вместо этого объект obj
класса MyClass
создается с помощью следующей строки кода.
MyClass obj = new MyClass { Count = 100, Str = "Тестирование" };
В этой строке кода имена полей указываются явно вместе с их первоначальными значениями. Это приводит к тому, что сначала конструируется экземпляр объекта типа MyClass
(с помощью неявно вызываемого по умолчанию конструктора), а затем задаются первоначальные значения переменных Count и Str
данного экземпляра.
Следует особо подчеркнуть, что порядок указания инициализаторов особого значения не имеет. Например, объект obj
можно было бы инициализировать и так, как показано ниже.
MyClass obj = new MyClass { Str = "Тестирование", Count = 100 };
В этой строке кода инициализация переменной экземпляра Str
предшествует инициализации переменной экземпляра Count
, а в приведенном выше коде все происходило наоборот. Но в любом случае результат получается одинаковым.
Ниже приведена общая форма синтаксиса инициализации объектов:
new имя_класса {имя = выражение, имя = выражение, . . . }
Интервал:
Закладка: