【コンソール】イベントのサンプル

イベントのシミュレーションサンプルになります
サンプルを読むには、クラスやインスタンスの概念も必要になります

サンプル

このサンプルはイベントの学習用です
学習を意識しなければ、イベントを使わなくても同じ結果が得られます
コード行も数行で終わります
大規模なアプリを想定したコードとなっていることを念頭においてください

コード

Mainメソッドが見当たらないのは、トップレベルステートメント(最上位レベルのステートメント)を使っているからです(トップレベルステートメントについては、参考ページで確認してください)

var gameManager = new GameManager();
gameManager.ButtonClickSim();

class GameManager
{
    MyEvnet myButtonEvent = new();

    public void ButtonClickSim()
    {
        var args1 = new MyEventArgs();
        var button1 = new Button("button1");
        args1.point = 10;
        ClickButton(button1, args1);

        var args2 = new MyEventArgs();
        var button2 = new Button("button2");
        args2.point = 20;
        ClickButton(button2, args2);
    }

    private void ClickButton(Button button, MyEventArgs args)
    {
        myButtonEvent.handler += button.Clicked;
        myButtonEvent.Invoke(button, args);
        myButtonEvent.handler -= button.Clicked;
    }
}

public class MyEventArgs
{
    public int point;
}

public class MyEvnet
{
    public delegate void MyEventHandler(object obj, MyEventArgs args);
    public event MyEventHandler? handler;

    public void Invoke(object sender, MyEventArgs e)
    {
        handler?.Invoke(sender, e);
    }
}

public class Button
{
    public string? Name { get; private set; }

    public Button(string name)
    {
        Name = name;
    }

    public void Clicked(object sender, MyEventArgs e)
    {
        Console.WriteLine($"ボタンが押された オブジェクト名{(sender as Button)?.Name} ポイント{e.point}");
    }
}

実行結果

ボタンが押された オブジェクト名button1 ポイント10
ボタンが押された オブジェクト名button2 ポイント20

参考

トップレベルステートメント

イベントハンドラの定義をSystem名前空間の定義済みのを使った場合

var gameManager = new GameManager();
gameManager.ButtonClickSim();

class GameManager
{
    MyEvnet myButtonEvent = new();

    public void ButtonClickSim()
    {
        var args1 = EventArgs.Empty;
        var button1 = new Button("button1");
        ClickButton(button1, args1);

        var args2 = EventArgs.Empty;
        var button2 = new Button("button2");
        ClickButton(button2, args2);
    }

    private void ClickButton(Button button, EventArgs args)
    {
        myButtonEvent.handler += button.Clicked;
        myButtonEvent.Invoke(button, args);
        myButtonEvent.handler -= button.Clicked;
    }
}

public class MyEvnet
{
    public event EventHandler? handler;

    public void Invoke(object sender, EventArgs e)
    {
        if (handler == null)
        {
            return;
        }
        handler(sender, e);
    }
}

public class Button
{
    public string? Name { get; private set; }

    public Button(string name)
    {
        Name = name;
    }

    public void Clicked(object? sender, EventArgs e)
    {
        Console.WriteLine($"ボタンが押された オブジェクト名{(sender as Button)?.Name}");
    }
}

C#,イベント

Posted by hidepon