Принципы объектно-ориентированного программирования

         

Оператор foreach



Оператор foreach

Некоторые языки, такие как Visual Basic, давно имеют специальные операторы для итерации массивов и наборов. В С# тоже есть такая конструкция — оператор foreach:

foreach (тип in выражение) встроенный _оператор



Рассмотрим следующий класс-массив:

class MyArray

<

public ArrayList words;

public MyArrayO {

words = new ArrayListO;

words.Add("foo");

words.Add("bar");

words.Add("baz"); } }

Познакомившись с итерационными операторами, вы понимаете, что пройти по массиву можно по-разному. Но для большинства Java- и С++-программистов наиболее логичным будет такой способ:

using System;

using System.Collections;

class MyArray

{

public ArrayList words;

public MyArrayO {

words = new ArrayListQ;

words.Add("foo");

words.Add("bar");

words.Add("baz"); } }

class ForeacMApp {

public static void Nain()

{

HyArray myArray = new MyArrayO;

for (int 1=0; i < myArray.words.Count; i++) {

Console.WriteLine("{0}", myArray.wordsfi]); } > }

Но такой подход обременен потенциальными проблемами:

  • если переменная цикла for проинициализирована некорректно, итерация всего списка будет невозможной;
  • если неверно булевское выражение оператора for, итерация всего списка будет невозможной;
  • если неверно приращение цикла, итерация всего списка будет невозможной;
  • у совокупностей и массивов разные методы и свойства для доступа к их счетчикам;
  • семантика выделения конкретного элемента из совокупности и массива различна;
  • во встроенном операторе цикла for при выделении элемента для него нужна переменная соответствующего типа.

Источников потенциальных проблем масса. Используя оператор foreach, этих проблем можно избежать и единообразно производить итерацию наборов и массивов. С оператором foreach предыдущий пример можно переписать так:

using System;

using System.Collections;

class MyArray

{

public ArrayList words;

public MyArrayO {

words = new ArrayListO;

words.Add("foo");

words.Add("bar");

words.Add("baz"); } }

class Foreach2App

{

public static void Main()

{

MyArray myArray = new MyArrayO;

foreach (string word in myArray.words)

{

Console.WriteLine("{0>", word);

} } }

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

 

Содержание раздела