Created
October 31, 2015 18:18
-
-
Save andriybuday/b50da859a158ec61927c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace LearnEvents | |
{ | |
// Defining delegate type (similar to System.EventHandler) | |
delegate void SomeHandler(object sender, EventArgs e); | |
class Person | |
{ | |
// Field-like event declared using keyword 'event' | |
// allows only for "+=" and "-=" on a hidden instance | |
// of a delegate of the type SomeHandler. | |
// Removing 'event' makes this into a field holding | |
// instance of a delegate. | |
public event SomeHandler OnSickness; | |
public Person() | |
{ | |
// Explicitly creating an instance of a delegate | |
SomeHandler sicknessHandler = | |
delegate (object sender, EventArgs e) | |
{ | |
Console.WriteLine("Person: Vomiting..."); | |
}; | |
// Adding above defined instance to invocation list | |
OnSickness += sicknessHandler; | |
} | |
public void EatTerribleFood() | |
{ | |
Console.WriteLine("Person: Eating terrible food..."); | |
// Invocation of a sickness event | |
if (OnSickness != null) | |
{ | |
OnSickness(this, null); | |
} | |
} | |
} | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var p = new Person(); | |
// adding anonymous method by external to Person code | |
p.OnSickness += (sender, e) => | |
{ Console.WriteLine("External: Calling doctor..."); }; | |
// COMPILATION ERROR | |
// as long as 'event' was used in first line | |
// of the Person class. External code cannot invoke sickness. | |
// Lines below will compile just fine if you remove 'event' | |
p.OnSickness = (sender, e) => | |
{ Console.WriteLine("External: Person feels happy..."); }; | |
p.OnSickness(p, null); | |
// For neater design it is responsibility of internals | |
// of the Person class to know when to invoke the event | |
p.EatTerribleFood(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment