Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
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..."); };
// 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.