8

カスタムイベントを発生させて処理する必要があるプロジェクトに取り組んでいます...コードを少し単純化して、次のようなものを得ました:

class Car
{
    public int Speed { get; set; }

    public delegate void SpeedTooHigh(string message);

    public event SpeedTooHigh OnSpeedToHigh;

    public Car(int speed)
    {
        this.Speed = speed;

        if (speed >= 100)
        {
            if (this.OnSpeedToHigh != null)
            {
                this.OnSpeedToHigh("Car has a too high speed !");
            }
        }
    }
}

そして、私がこのクラスを使用しているメインクラス:

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car(120, "Red", "Renault");

        car.OnSpeedToHigh += OnCarSpeedToHigh;

        Console.WriteLine("Test events");

        Console.ReadKey();
    }

    static void OnCarSpeedToHigh(string message)
    {
        Console.WriteLine(message);
    }
}

この例を実行しているとき、Car クラスでは常に「OnSpeedToHigh」が null のようです。そして、メインクラスでこのクラスのインスタンスを作成し、「this.OnSpeedToHigh("Car has a too high speed!")」が呼び出されるように速度を 100 より大きく設定しているため、理由がわかりません。

これは、クラスをインスタンス化し、たとえば速度を 100 より大きく設定するために、イベントを発生させるのに十分ですか?

これについて教えてください。

4

1 に答える 1

16

コンストラクターでイベントを発生させていますが、オブジェクトが構築されるまでイベント ハンドラーをイベントに追加していません。

イベントを発生させた時点ではまだイベント ハンドラーを追加していないため、イベントは null です。

おそらく、コンストラクターでイベントを発生させたくない、イベントをまったく使用したくない、またはイベントを静的にして、車が構築される前にイベントハンドラーを追加できるようにする必要があります。

于 2013-05-24T20:10:45.577 に答える