Программирование >>  Обработка исключительных ситуаций 

1 ... 66 67 68 [ 69 ] 70 71 72 ... 142


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 К статическим полям это ограничение не относится.



1 ... 66 67 68 [ 69 ] 70 71 72 ... 142

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