// Возвратить элементы в том порядке, в каком они размещены в массиве.
foreach (Car c in carArray)
{
yield return c;
}
}
}
}
Обратите внимание, что новый метод позволяет вызывающему коду получать элементы в прямом, а также в обратном порядке, если во входном параметре указано значение true
GetTheCars можно так (обязательно закомментируйте оператор throw new в методе GetEnumerator):Console.WriteLine("***** Fun with the Yield Keyword *****\n");
Garage carLot = new Garage;
// Получить элементы, используя GetEnumerator.
foreach (Car c in carLot)
{
Console.WriteLine("{0} is going {1} MPH",
c.PetName, c.CurrentSpeed);
}
Console.WriteLine;
// Получить элементы (в обратном порядке!)
// с применением именованного итератора.
foreach (Car c in carLot.GetTheCars(true))
{
Console.WriteLine("{0} is going {1} MPH",
c.PetName, c.CurrentSpeed);
}
Console.ReadLine;
Наверняка вы согласитесь с тем, что именованные итераторы являются удобными конструкциями, поскольку они позволяют определять в единственном специальном контейнере множество способов запрашивания возвращаемого набора.
Итак, в завершение темы построения перечислимых объектов запомните: для того, чтобы специальные типы могли работать с ключевым словом foreach
GetEnumerator, который формально определен интерфейсным типом IEnumerable. Этот метод обычно реализуется просто за счет делегирования работы внутреннему члену, который хранит подобъекты, но допускается также использовать синтаксис yield return, чтобы предоставить множество методов "именованных итераторов". Интерфейс ICloneable
Вспомните из главы 6, что в классе System.Object
MemberwiseClone, который применяется для получения MemberwiseClone во время процесса CloneablePoint, в котором определен класс Point:using System;
namespace CloneablePoint
{
// Класс по имени Point.
public class Point
{
public int X {get; set;}
public int Y {get; set;}
public Point(int xPos, int yPos) { X = xPos; Y = yPos;}
public Point{}
// Переопределить Object.ToString.
public override string ToString => $"X = {X}; Y = {Y}";
}
}
Учитывая имеющиеся у вас знания о ссылочных типах и типах значений (см.главу 4), должно быть понятно, что если вы присвоите одну переменную ссылочного типа другой такой переменной, то получите две ссылки, которые указывают на тот же самый объект в памяти. Таким образом, следующая операция присваивания в результате дает две ссылки на один и тот же объект Point
Console.WriteLine("***** Fun with Object Cloning *****\n");
// Две ссылки на один и тот же объект!
Point p1 = new Point(50, 50);
Point p2 = p1;
p2.X = 0;
Console.WriteLine(p1);
Console.WriteLine(p2);
Console.ReadLine;
Чтобы предоставить специальному типу возможность возвращения вызывающему коду идентичную копию самого себя, можно реализовать стандартный интерфейс ICloneable
ICloneable определен единственный метод по имени Clone:public interface ICloneable
{
object Clone;
}
Очевидно, что реализация метода Clone
Point:Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT