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

Chapter1 C# 3.0らしいプログラミングとは?

川俣 晶
2009/07/31

1.3 コードの遅延実行という例

 もう1つ簡単な例、リスト1.3を見てみよう。

 同じ同人ゲームのコードの一部である(ただし、例としてわかりやすいように実際のコードから改変している部分がある)。

QuickTalk q = new QuickTalk();

q.AddTalker("y", t.闇之ハヤト);

  …

int 語れるレベルカウント = 0;
SimpleMenuAction 語り = null;

if (General.Is江口高枝エンディング条件)
{
  語れるレベルカウント++;
  if (!State.IsFlag("闇之ハヤトから江口高枝の評価を聞いた"))
  {
    語り = ()=> // ラムダ式
    {
      q.Play(@"
y そうそう。
y 江口高枝さんから、あなたの噂を聞きました。
  …
");
      State.SetFlag("闇之ハヤトから江口高枝の評価を聞いた");
      return true;
    };
  }
}

  …

// %表示は20%から始まり4つの条件を満たすと100%になる
// つまり、闇之ハヤトは初期状態の主人公を20%は認めている
int 語れるレベル百分率 = (語れるレベルカウント + 1) * 20;

t.闇之ハヤト.Say("現在、『真相のさわり』を語ってあげられる水準は
{0}%といったところですね。", 語れるレベル百分率);

// 語りがあれば語らせる
if (語り != null)
{
  語り();
  …
}
リスト1.3 コードの遅延実行(C# 3.0)

 このメソッドでは、いくつかのイレギュラーな条件をカウントし、それによって動作を分けるとともに、それぞれの条件によってリアクションとしての「語り」が発生する場合がある。

 この処理で問題になるのは、成立した条件の数を知るためにはすべてのイレギュラーな条件の判定を行う必要があるため、条件を判定した瞬間にはまだリアクションができない点にある。

 そこで、条件を判定した瞬間に、未来に行うべきリアクションの内容をデリゲート型の変数にラムダ式として代入して保管しておき、後で語るべき時が来たら語らせるという構造を取った。

 このような「遅延実行」は、C# 1.xプログラミング……というよりC++からJavaを経由して続くPC上のOOPプログラミングではあまり見られないものかもしれない。しかし、JavaScriptプログラミングでは、SetTimeOut関数を用いた遅延実行はよくあるテクニックである。もちろん、上記のコードはSetTimeOut関数による遅延実行とは機能性においてまったく異なるものだが、「まだ実行できないコードを事前に記述しておく」というアイディアはSetTimeOut関数からの連想である。

 おそらく、JavaScript(やそれに類するほかの言語)になじんだプログラマーは、このようなコードをC# 3.0でもあたりまえのように平然と書くだろう。しかし、C# 1.xプログラマーは、このような書き方に慣れていない可能性があり、驚くかもしれない。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter1 C# 3.0らしいプログラミングとは?
    1.はじめに/本書の位置づけ
    2.1.1 意外性あり? 本書で解説すること/C# 3.0の適用範囲/筆者の来歴
    3.1.2 C# 3.0らしいソースコードとは?
  4.1.3 コードの遅延実行という例
    5.1.4 インターフェースとの比較
    6.1.5 後退するクラスの立場
    7.1.6 クラスベースとプロトタイプベース
    8.1.7 クラスベースの問題点/【C#olumn】クラスの問題とは何か?
    9.1.8 JavaScriptとの相違点
    10.まとめ/【C#olumn】金のハンマーと銀の弾丸―クラス至上主義
 
インデックス・ページヘ  「[完全版]究極の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 記事ランキング

本日 月間