|
Программирование >> Программирование с использованием ajax
В настоящей главе рассматриваются следующие расширения: а инициализаторы; □ выведение типов; □ анонимные типы; а методы расширения; □ лямбда-выражения. Пожалуй, наибольшим изменением в языке С# является технология 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}; Комбинируя инициализаторы коллекций с инициализаторами объектов, коллекции можно конфигурировать с помощью простого и элегантного кода. То есть, например, вместо такого кода:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |