連載:[完全版]究極のC#プログラミング

Chapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド

川俣 晶
2009/08/31

3.5 yield break文による中断

 さて、ここで気になるのはyield return文が列挙を中断しないとしたら、中断させるにはどうすればよいのか……ということである。

 処理の途中で何かの例外的条件に引っ掛かって、そこで処理を打ち切るのは定番処理の1つである。

 ここで、「簡単簡単。return文でメソッドを抜ければ終わるのだろう?」と考えた読者も多いと思うが話はそれほど甘くはない。なぜなら、反復子ブロックは“ブロックであってブロックではない”からだ。反復子ブロックは、実際に実行される場合には、バラバラに分解され、自動的に生成される列挙子オブジェクトに組み込まれることになる。その結果として、単純にreturn文で抜け出せるような簡単な構造ではなくなっているのだ。

 しかし、それでは不便なので、途中で反復子ブロックを打ち切って終了するyield break文」が用意されている。これを使えば、途中で打ち切る処理は容易に記述できる。

 リスト3.4にそれを使った例を示す。リスト3.4では「yield break;」が実行されるとその後のコードは実行されないので、「[#を返す]」や「#」が出力されることはない。

using System;
using System.Collections.Generic;

class Sample
{
  public IEnumerator<char> GetEnumerator()
  {
    Console.Write("[Cを返す]");
    yield return 'C';

    Console.Write("[yield break実行]");
    yield break;

    Console.Write("[#を返す]");
    yield return '#';
  }
}

class Program
{
  static void Main(string[] args)
  {
    foreach (char c in new Sample())
    {
      Console.Write("{0}", c);
    }
    // 出力:[Cを返す]C[yield break実行]
  }
}
リスト3.4 yield break文で処理を打ち切る


 INDEX
  [完全版]究極のC#プログラミング
  Chapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド
    1.3.1 「繰り返し」という古くて新しい問題
    2.3.2 数を数えるというサンプル
    3.3.3 C# 1.xによるRangeクラスの実装
    4.3.4 C# 3.0によるRangeクラスの実装
  5.3.5 yield break文による中断
    6.3.6 yieldは予約語ではない
    7.3.7 1つのクラスに複数の列挙機能を付ける
    8.3.8 自動的に作られるオブジェクトと二重利用
    9.3.9 catchできない制約
    10.3.10 制約の真相―見た目と違う真実の姿
    11.3.11 ForEachメソッドを使う別解
    12.3.12 性能比較
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間