2013-05-24 2 views
3

Я просто работаю над проектом, в котором мне нужно поднимать и обрабатывать пользовательские события ... я просто упростил немного Кодекса и получил что-то вроде этого:C# событие является пустым

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); 
    } 
} 

Когда я бегу этот пример, кажется, что все время «OnSpeedToHigh» является недействительным в классе автомобилей. И я не понимаю, почему, поскольку я создаю экземпляр этого класса в основном классе и устанавливаю скорость, чтобы она была больше 100, так что «this.OnSpeedToHigh (« Автомобиль имеет слишком высокую скорость! »)».

Достаточно ли этого для поднятия события, чтобы создать экземпляр класса и установить скорость, например, 100?

Пожалуйста, дайте мне знать об этом.

+2

Хороший пример, почему события не заменяют исключения. –

ответ

10

Вы запускаете событие в конструкторе, но вы не добавляете обработчик событий к событию до тех пор, пока объект не будет создан.

Поскольку вы еще не добавили обработчиков событий во время запуска события, событие равно null.

Возможно, вы не хотите запускать событие в конструкторе, вы вообще не хотите использовать события или хотите, чтобы событие было статичным, чтобы вы могли добавить обработчик событий перед автомобилем построена.

+0

Чтобы добавить к этому, вы всегда должны проверить, имеет ли он значение null, прежде чем пытаться запустить событие, если нет прикрепленного обработчика. – mason

+0

@ msm8bball Что он уже делает. – Servy

+0

Благодарим за комментарий, это поможет мне решить проблему, переместив событие в свойство Speed ​​и присвоив свойство значение после добавления обработчика событий, поднимает событие, как ожидалось! Кроме того, использование статического события и назначение обработчика события перед тем, как автореализованное хранилище автомобилей и поднятие события из конструктора Car отлично работало! Спасибо за ваши объяснения! – Clock

Смежные вопросы