Программирование >>  Программирование с использованием ajax 

1 ... 125 126 127 [ 128 ] 129 130 131 ... 396


В настоящей главе рассматриваются следующие расширения: а инициализаторы;

□ выведение типов;

□ анонимные типы;

а методы расширения;

□ лямбда-выражения.

Пожалуй, наибольшим изменением в языке С# является технология LINQ (Language Integrated Query - язык интегрированных запросов), которая будет рассматриваться позже, в главах 26-29. Она представляет собой новый способ для манипулирования коллекциями объектов, которые могут происходить из ряда различных источников, в том числе из базы данных и XML-документа. Многие из усовершенствований, которые будут рассматриваться в настоящей главе, в основном используются вместе с LINQ, хотя сами по себе являются расширениями.

Инициализаторы

В предьщущих главах уже показывалось, как создавать экземпляры объектов и инициализировать их различными способами. В каждом случае для этого требовалось либо добавлять в определения классов дополнительный код для обеспечения инициализации, либо создавать экземпляры объектов и инициализировать их с помощью отдельных операторов. Также демонстрировалось и то, как создавать классы коллекций различных типов, обобщенные классы коллекций включительно. Опять-таки, можно было заметить, что никакого простого способа для объединения создания коллекции с добавлением в нее элементов не существовало.

Инициализаторы (initializers) объектов предоставляют способ для упрощения кода, позволяя объединять операцию создания экземпляров и операцию инициализации объектов. Инициализаторы коллекций предлагают простой элегантный синтаксис для создания и заполнения коллекций за один шаг. В этом разделе объясняется, как использовать оба новых механизма.

Инициализаторы объектов

Рассмотрим следующее простое определение класса:

public class Curry {

public string Mainlngredient {get; set;} public string Style (get; set;} public int Spiciness (get; set;}

У этого класса есть три свойства, определенные с применением синтаксиса автоматических свойств, который демонстрировался в главе 10. При желании создать и инициализировать экземпляр объекта этого класса нужно использовать несколько следующих операторов:

Curry tastyCurry = new Curry (); tastyCurry.Mainlngredient = panir tikka ; tastyCurry.Style = jalfrezi ; tastyCurry.Spiciness = 8;

Если не включить в определение класса никакого конструктора, для этого кода будет использоваться конструктор по умолчанию, не принимающий параметров, кото-



рый предоставляется компилятором С#. Для упрощения этой операции инициализации можно предусмотреть соответствующий конструктор не по умолчанию:

public class Curry {

public Curry(string mainlngredient, string style, int spiciness) {

Mainlngredient = mainlngredient; Style = style; Spiciness = spiciness;

} *

Это позволит написать следующий код и объединить операцию создания экземпляра с операцией инициализации:

Curry tastyCurry = new CurryCpanir tikka , jalfrezi , 8);

Этот код будет работать нормально, но еще также будет вынуждать код, использующий данный класс, применять именно этот конструктор и тем самым не позволять работать предшествующему коду, в котором использовался конструктор без параметров. Поэтому зачастую, а особенно в тех случаях, когда классы должны допускать сериали-зацию, необходимо также предоставлять и конструктор без параметров:

public class Curry {

public CurryO

Теперь создавать экземпляр класса Curry и инициализировать его можно любым способом, но чтобы добиться этого, в первоначальное определение класса пришлось добавить нескольких строк кода, которые не делают ничего, кроме предоставления базовых деталей, необходимых для того, чтобы все работало.

Инициализаторы объектов представляют собой способ, позволяющий создавать экземпляры и инициализировать объекты без добавления дополнительного кода (вроде описанного в предыдущем примере кода конструкторов). Они подразумевают предоставление при создании экземпляра объекта значений для общедоступных свойств или полей с использованием пары имя-значение для каждого свойства, которое требуется инициализировать. Необходимый для этого синтаксис выглядит так:

имя класса имя переменной = new имя класса

свойство или поле1 = значение!, свойство или поле2 = значение2,

свойство или полеЫ = valueN

Например, код для создания экземпляра и инициализация объекта типа Curry, который приводился ранее, можно было бы переписать следующим образом:

Curry tastyCurry = new Curry {

Mainlngredient = panir tikka . Style = jalfrezi , Spiciness = 8



Часто в случае применения инициализатора объекта явно вызывать конструктор класса нельзя (в синтаксисе инициализаторов объектов не разрешено использовать круглые скобки). Вместо этого автоматически вызывается конструктор по умолчанию без параметров. И происходит это до установки инициализатором каких-либо значений параметров, что позволяет при желании предоставлять в конструкторе по умолчанию для параметров стандартные значения. В случае если никакой конструктор для класса не предусмотрен, предоставляемый компилятором общедоступный конструктор по умолчанию тоже будет работать вполне хорошо.

Из-за такого автоматического вызова конструктора, чтобы инициализаторы объектов работали, им необходимо иметь доступ к конструктору класса по умолчанию. Поэтому в случае добавления конструктора не по умолчанию с параметрами также требуется предоставлять и конструктор по умолчанию, точно так же, как было в предыдущем примере, где конструкторы применялись для инициализации свойств.

Если одно из свойств, которые нужно инициализировать с помощью инициализатора объектов, сложнее свойств простых типов, которые были показаны в данном примере, тогда может потребоваться использовать вложенный инициализатор объектов. Это подразумевает применение точно такого же синтаксиса, как уже приводился:

Curry tastyCurry = new Curry (

Mainlngredient = panir tikka . Style = jalfrezi , Spiciness = 8,

Origin = new Restaurant {Name = Kings Balti , Location = York Road , Rating = 5}

Здесь инициализируется свойство с именем Origin типа Restaurant (который тут не показан). В частности, в представляющей его строке кода вместе с ним инициализируется еще и три таких свойства, как Name, Location и Rating, со значениями, соответственно, типа string, string и int. Получается, что в этом коде инициализации используется вложенный инициализатор объектов.

Обратите внимание, что инициализаторы объектов не являются заменителями конструкторов не по умолчанию. Тот факт, что их можно использовать для установки значений свойств и полей при создании экземпляра объекта, вовсе не означает, что всегда будет известно, какое именно состояние нужно инициализировать. В случае же применения конструкторов можно точно указывать, какие значения требуются для того, чтобы объект мог функционировать, и затем немедленно выполнять код в ответ на эти значения.

Инициализаторы коллекций

В главе 5 уже показывалось, как можно инициализировать массивы со значениями с помощью следующего синтаксиса:

int[] mylntArray = new int[5] {5, 9, 10, 2, 99};

Он является быстрым и простым способом для объединения создания экземпляра и инициализации массива. Инициализаторы коллекций просто адаптируют этот синтаксис под коллекции:

List<int> mylntCollection = new List<int> {5, 9, 10, 2, 99};

Комбинируя инициализаторы коллекций с инициализаторами объектов, коллекции можно конфигурировать с помощью простого и элегантного кода. То есть, например, вместо такого кода:



1 ... 125 126 127 [ 128 ] 129 130 131 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика