public static void InvokeDelegate3()
        {
            GeneralExampleClass generalExampleClass = new GeneralExampleClass("starting Name");

            generalExampleClass.NameChangedArgs += new NameChangeDelegateArgs(DoSomthingWhenEventFires);
            generalExampleClass.MyOtherName      = "charlie";
            generalExampleClass.MyOtherName      = "chuckles";
        }
        public static void InvokeDelegate2()
        {
            GeneralExampleClass generalExampleClass = new GeneralExampleClass();

            // by using the += we can concatinate event delegates to the NameChanged Property over and over so that each method tied to the
            // delegate added is fired when the MyName Property changes. Its a way to add many methods to one property being used by a delegate.
            // each one of these are considered to be subscriptions to the event that is actually a delegate.
            generalExampleClass.NameChanged += new NameChangeDelegate(DoSomthingWhenNamedChanged);
            generalExampleClass.MyName       = "some name";

            generalExampleClass.NameChanged += new NameChangeDelegate(DoSomthingWhenNamedChanged2);
            generalExampleClass.MyName       = "some name2";

            // the C# compilier is smart enough to find the correct method without invoking a new NameChangedDelegate object
            generalExampleClass.NameChanged += DoSomthingWhenNamedChanged3;
            generalExampleClass.MyName       = "some name3";
        }