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

1 ... 128 129 130 [ 131 ] 132 133 134 ... 396


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

Как реализуются остальные члены анонимных типов можно увидеть в следующем практическом занятии.

Практическое занятие

Анонимные типы

1. Создайте новое консольное приложение по имени СЫ4Ех02 и сохраните его в каталоге С:\BegVCSharp\Chapterl4.

2. Измените код в его файле Program, cs следующим образом:

static void Main(string [ ] args)

var curries = new[] {

new { Mainlngredient = Lamb , Style = Dhansak , Spiciness = 5 }, new { Mainlngredient = Lamb , Style = Dhansak , Spiciness = 5 }, new { Mainlngredient = Chicken , Style = Dhansak , Spiciness = 5 }

Console.WriteLine(curries[0].ToString()) ; Console.WriteLine(curries[0].GetHashCode()) ; Console.WriteLine(curries[1].GetHashCode()); Console.WriteLine(curries[2].GetHashCode()) ; Console.WriteLine(curries[0].Equals(curries[1])); Console.WriteLine(curries[0].Equals(curries[2])); Console.WriteLine(curries [0] == curries [ 1]); Console.WriteLine (curries [0] == curries[2]); Console.ReadKey 0;

3. Запустите это приложение. На рис. 14.7 показан результат, который должен получиться.

I W#: /r:megVCSherpAChapter14 Ch14Ex02Ch14Fx02 ЫпЛ>Ьив/...

< Nriinlnsredii-nt ЬалЬ, Stvlf Dhan ..к, Spiciness ::9489741Ь :94в97431. ,21Ь7126! I гиг-Га Ise а be

Рис. 14.7. Приложение Chi 4 Ex О 2 в действии

Описание полученных результатов

в этом примере иллюстрируется создание массива объектов с анонимными типами и последующее его применение для тестирования поставляемых анонимными типами членов. Код для создания массива анонимно типизированных объектов выглядит следующим образом:

var curries = new [ ]

new { Mainlngredient = Lamb , Style = Dhansak , Spiciness = 5 }, new { Mainlngredient = Lamb , Style = Dhansak , Spiciness = 5 }, new { Mainlngredient = Chicken , Style = Dhansak , Spiciness = 5 }



Здесь используется массив, который неявно приводится к анонимному типу за счет применения комбинированного синтаксиса, одна часть которого демонстрировалась в этом разделе, а другая - в разделе Выведение типов ранее в главе. В результате получается, что в переменной curries содержится три экземпляра анонимного типа.

После создания такого массива в коде первым делом выводится результат вызова для анонимного типа метода ToString:

Console.WriteLine(curries[0].ToString()); Это приводит к получению следующего вывода:

{ Mainlngredient = Lamb, Style = Dhansak, Spiciness = 5 }

To есть реализация метода ToString () в анонимном типе подразумевает вывод значений каждого из определенных для этого типа свойств.

Далее в коде для каждого из трех объектов массива вызывается метод GetHashCode ():

Console.WriteLine(curries[0].GetHashCode() Console.WriteLine(curries[1].GetHashCode() Console.WriteLine(curries[2].GetHashCode()

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

294897435 294897435 621671265

Затем вызывается метод Equals () для сравнения первого объекта сначала со вторым, а потом - с третьим объектом:

Console.WriteLine(curries[0].Equals(curries[1])); Console.WriteLine(curries[0].Equals(curries[2]));

Результат получается следующий:

True False

Реализация метода Equals () в анонимных типах подразумевает сравнение состояния объектов. Значение true возвращается в тех случаях, когда каждое свойство одного объекта содержит такое же значение, как и сравниваемое с ним свойство в другом объекте.

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

Console.WriteLine(curries [0] == curries[l]); Console.WriteLine(curries [0] == curries [2]);

Каждый элемент в массиве curries ссылается на другой экземпляр анонимного типа, поэтому в результате в обоих случаях возвращается значение false. То есть вывод выглядит именно так, как и следовало ожидать:

False False



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

Методы расширений

Методы расширений (extension methods) позволяют расширять функциональные возможности типов без внесения изменения в сами типы. Их можно использовать для расширения даже таких типов, которые нельзя изменять - тех, что поставляются в .NET Framework включительно. Например, с помощью метода расширения, можно даже прибавлять функциональных возможностей и таким фундаментальным типам, как System. String.

В таком контексте под расширением функциональных возможностей типа подразумевается предоставление метода, который можно было бы вызывать через экземпляр этого типа. Создаваемый для этого метод как раз и называется методом расширения. Он может принимать любое количество параметров и возвращать значение любого типа (включая void). Необходимые для создания и использования метода расширения шаги перечислены ниже.

1. Создать не обобщенный статический класс.

2. Добавить в созданный класс метод расширения в виде статического метода с использованием специального синтаксиса (который будет описываться чуть ниже).

3. Удостовериться в том, что в коде, где планируется использовать метод расширения, импортируется содержащее его класс пространство имен с помощью оператора using.

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

Компилятор языка С# творит свои чудеса между третьим и четвертым шагом. ШЕ-среда мгновенно понимает, что был создан метод расширения, и даже отображает его в окне IntelliSense, как показано на рис. 14.8.

На рис. 14.8 видно, что метод MyMarvelousExtensionMethod () доступен через объект string (под каковым здесь подразумевается всего лишь литеральная строка). Этот метод обозначен немного отличающимся значком с указывающей вниз стрелкой синего цвета, не принимает никаких дополнительных параметров и возвращает string.

Иу string object

♦ ljNorm rtzecl

♦ LastlndexOf

♦ iBstlndexOfAny

(extension) string string MyMarvelousExtenslonMethodOl

Normeltze [

♦ Pedleft Ф PadRight

Removt

♦ ReplBCf

Puc. 14.8. Отображение в IntelliSense данных о методе расширения



1 ... 128 129 130 [ 131 ] 132 133 134 ... 396

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