// The Delegate declaration which defines the signature of methods which can be invoked
public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel);
// Class which makes the event
public class Game {
// Note the use of the event keyword
public event ScoreChangeEventHandler ScoreChange;
int score;
// Score Property
public int Score {
get {
return score;
}
set {
if (score != value) {
bool cancel = false;
ScoreChange (value, ref cancel);
if (! cancel)
score = value;
}
}
}
}
// Class which handles the event
public class Referee
{
public Referee (Game game) {
// Monitor when a score changes in the game
game.ScoreChange += new ScoreChangeEventHandler (game_ScoreChange);
}
// Notice how this method signature matches the ScoreChangeEventHandler's signature
private void game_ScoreChange (int newScore, ref bool cancel) {
if (newScore < 100)
System.Console.WriteLine ("Good Score");
else {
cancel = true;
System.Console.WriteLine ("No Score can be that high!");
}
}
}
// Class to test it all
public class GameTest
{
public static void Main () {
Game game = new Game ();
Referee referee = new Referee (game);
game.Score = 70;
game.Score = 110;
}
}