|
Программирование >> Обработка исключительных ситуаций
for ( int i = 0; i < n; ++i ) if ( mas[i] .GetTypeO .Name yield return mas[i]; Monster ) public void Add( Monster m ) { if ( n >= 10 ) return: mas[n] = m; ++n: class Classl { static void MainO Stado s = new StadoO; s.Add( new Monster() ); s.Add( new Monster( Bacя ) ): s.Add( new Daemon() ); foreach ( Monster i in s ) foreach ( Monster i in s.Backwards О ) foreach ( Monster i in s.MonstersOnly() i.PassportO i.Passport О i.PassportO Теперь, когда вы получили представление об итераторах, рассмотрим их более формально. Блок итератора синтаксически представляет собой обычный блок и может встречаться в теле метода, операции или части get свойства, если соответствующее возвращаемое значение имеет тип IEnumerable или IEnumerator1. В теле блока итератора могут встречаться две конструкции: yield return формирует значение, выдаваемое на очередной итерации; yield break сигнализирует о завершении итерации. Ключевое слово yield имеет специальное значение для компилятора только в этих конструкциях. Код блока итератора выполняется не так, как обычные блоки. Компилятор формирует служебный объект-перечислитель, при вызове метода MoveNext которого выполняется код блока итератора, выдающий очередное значение с помощью ключевого слова yield. Следующий вызов метода MoveNext объекта-перечислителя возобновляет выполнение блока итератора с момента, на котором он был приостановлен в предыдущий раз. А также тип их параметризованных двойников IEnumerable<T> или IEnumerator<T> из пространства имен System. Collections .Generic, описанного в главе 13. Структура - -с\та камш., отдаадлик тьдакх , лкяювукл р Ч \ ш ш crtnvi чий от него: Q стоуклурл является значимым, a -fte ссылочным титлом дашх, то е.с\ъ -этаело ляр страту ръ\ хранит значения своих элементов, а не ссылки на них, и расп лагается в стеке, а не в хипе; структура не может участвовать в иерархиях наследования, она может толы реализовывать интерфейсы; в структуре запрещено определять конструктор по умолчанию, поскольку с определен неявно и присваивает всем ее элементам значения по умолчани (нули соответствующего типа); в структуре запрещено определять деструкторы, поскольку это бессмысленн ПРИМЕЧАНИЕ- Строго говоря, любой значимый тип С# является структурным. Отличия от классов обусловливают область применения структур: типы данны имеющие небольшое количество полей, с которыми удобнее работать как со зн чениями, а не как со ссылками. Накладные расходы на динамическое выделен! памяти для небольших объектов могут весьма значительно снизить быстродейств! программы, поэтому их эффективнее описывать как структуры, а не как класс! ПРИМЕЧАНИЕ- С другой стороны, передача структуры в метод по значению требует и дополю тельного времени, и дополнительной памяти. Синтаксис структуры: [ атрибуты ] [ спецификаторы ] struct имяструктуры [ : интерфейсы ] тело структуры [ ; ] Спецификаторы структуры имеют такой же смысл, как и для класса, причем у спецификаторов доступа допускаются только public, internal и private (после; ний - только для вложенных структур). Интерфейсы, реализуемые структурой, перечисляются через запятую. Тело струк туры может состоять из констант, полей, методов, свойств, событий, индексатс ров, операций, конструкторов и вложенных типов. Правила их описания и ис пользования аналогичны соответствующим элементам классов, за исключение: некоторых отличий, вытекающих из упомянутых ранее: поскольку структуры не могут участвовать в иерархиях, для их элементов н могутиспользоваться спецификаторы protected и protected internal; структуры не могут быть абстрактными (abstract), к тому же по умолчанш они бесплодны (sealed); методы структур не могут быть абстрактными и виртуальными; переопределяться (то есть описываться со спецификатором override) могут только методы, унаследованные от базового класса object; параметр this интерпретируется как значение, поэтому его можно использовать для ссылок, но не для присваивания; при описании структуры нельзя задавать значения полей по умолчанию1 - это будет сделано в конструкторе по умолчанию, создаваемом автоматически (конструктор присваивает значимым полям структуры нули, а ссылочным - значение nul 1). В листинге 9.8 приведен пример описания структуры, представляющей комплексное число. Для экономии места из всех операций приведено только описание сложения. Обратите внимание на перегруженный метод ToString: он позволяет выводить экземпляры структуры на консоль, поскольку неявно вызывается в методе Console.WriteLine. Использованные в методе спецификаторы формата описаны в приложении. Листинг 9.8. Пример структуры using System; namespace ConsoleApplicati onl i struct Complex { public double re, im; public Complex( double re , double im ) re = re ; im = im ; можно использовать this.re, this.im public static Complex operator + ( Complex a. Complex b ) return new Complex( a.re + b.re, a.im + b.im ); public override string ToStringO return ( string.Format( ({0.2:0.##};{1,2:0.##}) . re, im ) ); class Classl { static void MainO Complex a = new Complex! 1.2345, 5.6 ); продолжение i 1 К статическим полям это ограничение не относится.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |