イベント駆動。
成果物
情報源
コード
class Main { private event EventHandler OnEdit; public Main() { OnEdit += OnEditDefault; } ~Main() { OnEdit -= OnEditDefault; } void OnEditDefault(object sender, EventArgs args) => Console.WriteLine("Edit event !"); public void Run() { OnEdit?.Invoke(this, EventArgs.Empty); } }
イベントハンドラEventHandler
はデリゲート。Action
と類似。戻り値が指定できない。
EventArgs
は引数。独自の型を作れる。
class Main { private event EventHandler<EditEventArgs> OnEdit; public Main() { OnEdit += OnEditDefault; } ~Main() { OnEdit -= OnEditDefault; } void OnEditDefault(object sender, EditEventArgs args) => Console.WriteLine($"Edit event !: {args.Path}"); public void Run() { OnEdit?.Invoke(this, new EditEventArgs("test.txt")); } } class EditEventArgs : EventArgs { public string Path { get; } public EditEventArgs(string path) => Path = path; }
EventArgs
を継承せずともよい。
class EditEventArgs { // EventArgs継承せずともよい public string Path { get; } public EditEventArgs(string path) => Path = path; }
eh.Invoke
をprivate
にできる。
public event EventHandler OnEdit { add { onEdit += value; } remove { onEdit -= value; } } private event EventHandler onEdit; public void Run() { // OnEdit?.Invoke(this, EventArgs.Empty); // error CS0079 onEdit?.Invoke(this, EventArgs.Empty); }
所感
非同期にもできるらしいが、よくわからなかった。そもそもevent
は戻り値がvoid
であるため、async Task
を返せない。それで正常に動かせるのか? 非同期のこともよく分かっていない。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- C# dotnet 3.0.100 ※
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux