やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#の概念 イベント

 イベント駆動。

成果物

情報源

コード

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.Invokeprivateにできる。

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を返せない。それで正常に動かせるのか? 非同期のこともよく分かっていない。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux