3

C#でのイベントの正確な使用法は何だろうと思っていました。私はまだ c# を学習中なので、何かが足りないかもしれませんが、デリゲートだけを使用することは可能ですか。
この例では、0 から 2^64 までカウントし、1000 の倍数に達するたびにイベントを発生させるメソッドを持つクラスを作成しました。コードは次のとおりです。

namespace EventDelegate
{
class Program
{
    static void Main(string[] args)
    {
        EventRaiserClass _eventraiser = new EventRaiserClass();
        _eventraiser.handler = SomeEventHandler;
        _eventraiser.handler += AnotherEventHandler;
        _eventraiser.Loop();
        Console.Read();
    }

    static void SomeEventHandler(object sender, EventArgs args)
    {
        Console.WriteLine("Event raised");
    }

    static void AnotherEventHandler(object sendr, EventArgs args)
    {
        Console.WriteLine("Event raised (Another handler)");
    }
}

public delegate void Handler(object sender, EventArgs args);

class EventRaiserClass
{
    public Handler handler;
    public void Loop()
    {
        for (long i = 0; i < Int64.MaxValue; i++)
        {
            if ((i % 1000) == 0)
            {
                EventArgs args = new EventArgs();
                RaiseEvent(args);
                System.Threading.Thread.Sleep(1000);
            }
        }
    }

    private void RaiseEvent(EventArgs args)
    {
        if (handler != null)
            handler(this, args);
    }
}

}

handlerデリゲート変数をこのようなイベントとして宣言した場合、どのような違いがあったでしょうかpublic event Handler handler。少し漠然としていたり​​、明らかなものが欠けていたりして申し訳ありませんが、デリゲートを使用するだけでなく、読みやすさのためだけに使用
するときに、舞台裏で何か他のことが起こるのではないかと思っています。event

4

1 に答える 1

2

イベントとデリゲートは似ていますが、正当な理由により、イベントはより制限されています。

あなたのコードでは_eventraiser.handler、外部からあらゆる種類のことを行うことができます。ただし、これらのことのほとんどを行うことは想定されていません。

次の行を検討してください。

_eventraiser.handler = SomeEventHandler;

デリゲートを使用する場合、イベント ハンドラーをアタッチしようとするたびに、デリゲートが であるかどうかを確認nullし、 で初期化する=必要があります。null でない場合は、 でハンドラーを追加+=するだけです。初期化を忘れると、null 参照例外が発生します。1 つ入れすぎると、以前のものをすべて上書きします。

この例でデリゲートの代わりにイベントを使用する場合、これを行う必要はなく、実際には行うことさえできません。デリゲートを使用すると、それを取得して他のクラスに渡すことさえできますが、これは非常に危険な可能性があります。

Invoke、およびデリゲートで実行できる他のすべてのことについても同じことが言えます。これらはイベントにはありません。外部クラスからのイベントでできることは、 と だけ+=です-=。複雑なゲッターとセッターを備えた特別なパブリック インターフェイスを使用して、それらをデリゲートとして表示できます。

(イベントには特殊なaddandremove構文もありますが、これはあまり使用されない機能です)

于 2013-04-01T11:22:09.547 に答える