public void Why_Need_Event_When_Delegate_Can_Do_What_Event_Do() { MyConsolWrite myConsolWrite = MyTest.ConsoleWrite; //Event version var test1 = new MyTest(); test1.DummyEvent += myConsolWrite; test1.OnDummyEventHappened("I am event"); //Event version with field var test1_1 = new MyTest(); test1_1.DummyEventProperty += myConsolWrite; test1_1.OnDummyEventHappened("I am event"); //delegate version var test2 = new MyTest(); test2.DummyDelegate = myConsolWrite; test2.OnDummyDelegateHappened("I am delegate"); test2.DummyDelegate = null; TestDelegate testDelegate = () => test2.OnDummyDelegateHappened("I will have exception, that's why i should not be a public property/field. danger to be easily override"); Assert.Throws <NullReferenceException>(testDelegate); }