for WPF developers
Home Profile Tips 全記事一覧

Action デリゲートで操作を保持する

(2016/12/03 0:19:21 created.)

操作を保持するには、System.Action デリゲートが非常に有用です。例えば次のようなコードを実行してみましょう。

Program.cs
  1. namespace Tips_Undo
  2. {
  3.     using System;
  4.  
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             DoWork(() =>
  10.             {
  11.                 Console.WriteLine("Action デリゲートで処理します。");
  12.             });
  13.  
  14.             Console.ReadKey();
  15.         }
  16.  
  17.         private static void DoWork(Action action)
  18.         {
  19.             if (action != null)
  20.                 action();
  21.         }
  22.     }
  23. }


DoWork() メソッドは、入力引数である Action デリゲートを実行するだけとなっています。つまり、DoWork() メソッドを呼び出す側が実際の処理内容を指定できるということです。

これを応用することで、例えば元に戻す機能を想定して次のようなコードが書けると思います。

Program.cs
  1. namespace Tips_Undo
  2. {
  3.     using System;
  4.     using System.Collections.Generic;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             actions = new Stack<Action>();
  11.             actions.Push(() => Console.WriteLine("始めの処理"));
  12.             actions.Push(() => Console.WriteLine("2 番目の処理"));
  13.             actions.Push(() => Console.WriteLine("3 番目の処理"));
  14.             actions.Push(() => Console.WriteLine("最後の処理"));
  15.  
  16.             Undo();
  17.             Undo();
  18.             Undo();
  19.             Undo();
  20.             Undo();
  21.  
  22.             Console.ReadKey();
  23.         }
  24.  
  25.         private static Stack<Action> actions;
  26.  
  27.         private static void Undo()
  28.         {
  29.             if (actions.Count > 0)
  30.             {
  31.                 var action = actions.Pop();
  32.                 if (action != null)
  33.                     action();
  34.             }
  35.             else
  36.             {
  37.                 Console.WriteLine("もうないよ!");
  38.             }
  39.         }
  40.     }
  41. }

System.Collections.Generic.Stack クラスはその名の通り型 T のインスタンスをスタックするためのクラスです。ここでは Action デリゲートをスタックするようにしています。
スタックを積み上げるには Push() メソッドを、スタックから取り出すには Pop() メソッドを使用します。Pop() メソッドを使用するとスタックから取り出されたインスタンスは除外されます。

やり直し機能は元に戻す機能の逆操作をおこなうわけですから、同じく System.Collection.Generic.Stack クラスで、元に戻す機能とは逆順に Action デリゲートを積み上げていくことになります。