}
// Этот итератор возвращает символы из массива chrs. public IEnumetator GetEnumerator() {
foreach(T obj in array) yield return obj;
}
}
class GenericItrDemo { static void Main() {
int [ ] nums ={4, 3, 6, 4, 7, 9 };
MyClass me = new MyClass(nums);
foreach(int x in me)
Console.Write(x + " ");
Console.WriteLine();
bool[] bVals = { true, true, false, true };
MyClass mc2 = new MyClass(bVals);
foreach(bool b in mc2)
Console.Write(b + " ");
Console.WriteLine ();
}
}
Вот к какому результату приводит выполнение этой программы.
4 3 6 4 7 9
True True False True
В данном примере массив, состоящий из возвращаемых по очереди объектов, передается конструктору класса MyClass. Тип этого массива указывает в качестве аргумента типа в конструкторе класса MyClass.
Метод GetEnumerator () оперирует данными обобщенного типа Т и возвращает перечислитель типа IEnumerator. Следовательно, итератор, определенный в классе MyClass, способен перечислять данные любого типа.
Инициализаторы коллекций
В С# имеется специальное средство, называемое инициализатором коллекции и упрощающее инициализацию некоторых коллекций. Вместо того чтобы явно вызывать метод Add () , при создании коллекции можно указать список инициализаторов. После этого компилятор организует автоматические вызовы метода Add () , используя значения из этого списка. Синтаксис в данном случае ничем не отличается от инициализации массива. Обратимся к следующему примеру, в котором создается коллекция типа List, инициализируемая символами С, А, Е, В, D и F.
List 1st = new List() { 'С 1, 'А 1, 'Е 1, 'В 1, 1D 1, 1F 1};
После выполнения этого оператора значение свойства 1st. Count будет равно6 , поскольку именно таково число инициализаторов. А после выполнения следующего цикла foreach:
foreach(ch in 1st)
Console.Write(ch + " ");
получится такой результат:
С A E В D F
Для инициализации коллекции типа LinkedListcTKey, TValue>, в которой хранятся пары "ключ-значение", инициализаторы приходится предоставлять парами, как показано ниже.
SortedListcint, string> 1st =
new SortedListcint, string>() { {1, "один 11}, {2, "два" }, {3, "три"} };
Компилятор передаст каждую группу значений в качестве аргументов методу Add () . Следовательно, первая пара инициализаторов преобразуется компилятором в вызов Add(1, " один ").
Компилятор вызывает метод Add () автоматически для ввода инициализаторов в коллекцию, и поэтому инициализаторы коллекций можно использовать только в коллекциях, поддерживающих открытую реализацию метода Add () . Это означает, что инициализаторы коллекций нельзя использовать в коллекциях типа Stack, Stack, Queue или Queue, поскольку в них метод Add () не поддерживается. Их нельзя применять также в тех коллекциях типа LinkedList, где метод Add () предоставляется как результат явной реализации соответствующего интерфейса.
ГЛАВА 26 Сетевые средства подключения к Интернету
Язык C# предназначен для программирования в современной вычислительной среде, где Интернету, естественно, принадлежит весьма важная роль. Одной из главных целей разработки C# было внедрение в этот язык программирования средств, необходимых для доступа к Интернету. Такой доступ можно было осуществить и в предыдущих версиях языков программирования, включая С и C++, но поддержка операций на стороне сервера, загрузка файлов и получение сетевых ресурсов в этих языках не вполне отвечали потребностям большинства программистов. Эта ситуация коренным образом изменилась в С#. Используя стандартные средства C# и среды .NET Framework, можно довольно легко сделать приложения совместимыми с Интернетом и написать другие виды программ, ориентированных на подключение к Интернету.
Поддержка сетевого подключения осуществляется через несколько пространств имен, определенных в среде .NET Framework, и главным среди них является пространство имен System.Net. В нем определяется целый ряд высокоуровневых, но простых в использовании классов, поддерживающих различные виды операций, характерных для работы с Интернетом. Для этих целей доступен также ряд пространств, вложенных в пространство имен System. Net. Например, средства низкоуровневого сетевого управления через сокеты находятся в пространстве имен System.Net. Sockets, поддержка электронной почты — в пространстве имен System.Net.Mail, а поддержка защищенных сетевых потоков — в пространстве имен System.Net. Security. Дополнительные функциональные возможности предоставляются в ряде других вложенных пространств имен. К числу других не менее важных пространств имен,
Читать дальше