делегаты и события - PullRequest
       4

делегаты и события

3 голосов
/ 21 октября 2010

Я создал очень простую фиктивную программу для понимания делегатов и событий. В моей программе ниже я просто вызываю метод. Когда я вызываю метод, пять методов автоматически вызываются с помощью делегатов и событий.

Пожалуйста, посмотрите на мою программу и дайте мне знать, где я ошибаюсь или прав, поскольку я впервые использую делегатов и события.

using System;

namespace ConsoleApplication1
{
    public delegate void MyFirstDelegate();

    class Test
    {
        public event MyFirstDelegate myFirstDelegate;

        public void Call()
        {
            Console.WriteLine("Welcome in Delegate world..");
            if (myFirstDelegate != null)
            {
                myFirstDelegate();
            }
        }        
    }

    class AttachedFunction
    {
        public void firstAttachMethod()
        {
            Console.WriteLine("ONE...");
        }
        public void SecondAttachMethod()
        {
            Console.WriteLine("TWO...");
        }
        public void thirdAttachMethod()
        {
            Console.WriteLine("THREE...");
        }
        public void fourthAttachMethod()
        {
            Console.WriteLine("FOUR...");
        }
        public void fifthAttachMethod()
        {
            Console.WriteLine("FIVE...");
        }
    }

    class MyMain
    {
        public static void Main()
        {
            Test test = new Test();
            AttachedFunction attachedFunction = new AttachedFunction();
            test.myFirstDelegate += new MyFirstDelegate(attachedFunction.firstAttachMethod);
            test.myFirstDelegate += new MyFirstDelegate(attachedFunction.SecondAttachMethod);
            test.myFirstDelegate += new MyFirstDelegate(attachedFunction.thirdAttachMethod);
            test.myFirstDelegate += new MyFirstDelegate(attachedFunction.fourthAttachMethod);
            test.myFirstDelegate += new MyFirstDelegate(attachedFunction.fifthAttachMethod);

            test.Call();
            Console.ReadLine();
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 21 октября 2010

События реализуются с использованием делегатов. Тем не менее, по соглашению события принимают форму:

 void EventHandler(Object sender, EventArgs args);

EventHandler на самом деле является делегатом, определенным в .Net. EventArgs - это класс в .Net, который выполняет роль заполнителя для передачи дополнительной информации. Если у вас есть дополнительная информация, вы создадите класс, который получен из EventArgs и содержит свойства для дополнительных данных; поэтому вы бы создали свой собственный делегат так:

void MyEventHandler(Object sender, MyEventArgs args);

У Microsoft есть учебник по событиям здесь , а также описывается определение и повышение событий здесь

2 голосов
/ 21 октября 2010

Это обычная схема работы с событиями:

// define the delegate
public delegate void CustomEventHandler(object sender, CustomEventArgs e);

// define the event args
public class CustomEventArgs : EventArgs
{
     public int SomeValue { get; set; }

     public CustomEventArgs( int someValue )
     {
         this.SomeValue = someValue;
     }
}

// Define the class that is raising events
public class SomeClass
{
    // define the event
    public event CustomEventHandler CustomEvent;

    // method that raises the event - derived classes can override this
    protected virtual void OnCustomEvent(CustomEventArgs e)
    {
        // do some stuff
        // ...

        // fire the event
        if( CustomEvent != null )
            CustomEvent(this, e);
    }

    public void SimulateEvent(int someValue)
    {
        // raise the event
        CustomEventArgs args = new CustomEventArgs(someValue);

        OnCustomEvent(args);
    }
}

public class Main
{
    public static void Main()
    {
        SomeClass c = new SomeClass(); 

        c.CustomEvent += SomeMethod;
        c.SimulateEvent(10); // will cause event
    }

    public static void SomeMethod(object sender, CustomEventArgs e)
    {
         Console.WriteLine(e.SomeValue);
    }
}
0 голосов
/ 21 октября 2010

Попробуйте поставить строку

public delegate void MyFirstDelegate();

внутри класса теста.

Также используйте вместо этого функцию Invoke для события, т.е.

myFirstDelegate.Invoke();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...