Action デリゲートで操作を保持する
(2016/12/03 0:19:21 created.)
操作を保持するには、System.Action デリゲートが非常に有用です。例えば次のようなコードを実行してみましょう。
Program.cs
namespace Tips_Undo
{
using System;
class Program
{
static void Main(string[] args)
{
DoWork(() =>
{
Console.WriteLine("Action デリゲートで処理します。");
});
Console.ReadKey();
}
private static void DoWork(Action action)
{
if (action != null)
action();
}
}
}
DoWork() メソッドは、入力引数である Action デリゲートを実行するだけとなっています。つまり、DoWork() メソッドを呼び出す側が実際の処理内容を指定できるということです。
これを応用することで、例えば元に戻す機能を想定して次のようなコードが書けると思います。
Program.cs
namespace Tips_Undo
{
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
actions = new Stack<Action>();
actions.Push(() => Console.WriteLine("始めの処理"));
actions.Push(() => Console.WriteLine("2 番目の処理"));
actions.Push(() => Console.WriteLine("3 番目の処理"));
actions.Push(() => Console.WriteLine("最後の処理"));
Undo();
Undo();
Undo();
Undo();
Undo();
Console.ReadKey();
}
private static Stack<Action> actions;
private static void Undo()
{
if (actions.Count > 0)
{
var action = actions.Pop();
if (action != null)
action();
}
else
{
Console.WriteLine("もうないよ!");
}
}
}
}
System.Collections.Generic.Stack
スタックを積み上げるには Push() メソッドを、スタックから取り出すには Pop() メソッドを使用します。Pop() メソッドを使用するとスタックから取り出されたインスタンスは除外されます。
やり直し機能は元に戻す機能の逆操作をおこなうわけですから、同じく System.Collection.Generic.Stack
Tweet