의뢰와 이벤트 (파라미터 이벤트와 파라미터 이벤트 없음)

17939 단어 이벤트
1. 의뢰【CSDN 참조】를 사용하는 이유
(1) 클래스를 쓸 때 어떤 대상을 호출할 방법을 정할 수 없다. 예를 들어 마이크로소프트의 textbox 이벤트에 자신의 대상을 연결하는 방법이다.마이크로소프트가 textbox를 쓸 때 이 사건이 발생했을 때 어떤 대상을 호출해야 하는지 알 수가 없다. 오직 너 자신이 어떤 방법을 조정해야 하는지 지정하고 의뢰하는 방식으로 해당하는 사건에 걸어야 한다.마이크로소프트가textbox의 이벤트를 쓸 때 유일하게 확실한 것은 이 이벤트의 형식입니다. 또는 이 이벤트가 호출해야 하는 방법의 형식입니다.button1 와 유사합니다.click(object sender, EnentArgse) 등.이 유형에 따라 쓰는 방법이라면 모두 이 사건에 걸릴 수 있고, 사건이 발생할 때 방법이 호출될 수 있다.이것은 단지 메시지 구동에 기초한 실현 방식 중의 하나일 뿐이다.
(2)'입으로 먹는 과정'을 하나의 클래스로 포장한다면 상상해 보세요. 그 중에서 이 동작을 먹는 것에 대해 이렇게 정의합니다. public void 먹기(음식) {음식을 입에 넣는다();//step 1 입에서 움직임(음식);//step 2 삼키기(삼킬 수 있는지);//step 3}
2단계에 주의하라. 음식에 따라 입이 다른 방식으로 처리된다.음식==물, 씹지 않고 음식으로 삼킨다==고기만두, 당연히 씹고 삼켜야 한다=껌, 음식으로만 씹고 삼키지 않는다==생선, 가시를 꼼꼼히 뱉어야 한다.분명히 너는 너의 클래스에서 모든 상황을 예견할 수 없다. 이런 상황에서 '입이 움직이기 시작한다' 는 고려를 의뢰로 정의하여 클라이언트가 호출할 때 구체적으로 실현하도록 할 수 있다. 클래스에서 차지하는 것은 단지 하나의 위치를 차지할 뿐이다.
2. 위탁을 실현하는 절차
1. 의뢰 정의 2.위임 인스턴스 정의 3.방법을 위탁 실례에 등록하다.만약 위탁에 등기 사건이 있으면 실례를 집행한다
두 가지 간단한 예를 들다.
//    
 public class Test
    {
        private delegate void CatShoutHandle();
        private event CatShoutHandle CatShout;

        public void TestDelegate()
        {

            CatShout += new CatShoutHandle(c_CatShout);
            if (CatShout != null)
            {
                CatShout();
            }
        }

        void c_CatShout()
        {
            Console.WriteLine("This is my Test Delagate!");
        }

        static void Main()
        {

            Test c = new Test();
            c.TestDelegate();
            return;
        }
    }

매개변수 상황 있음
// 
 public class MyParameter:EventArgs
    {
        private string name;
        public MyParameter(string _name)
        {
            this.name = _name;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

    public class Test
    {
        private delegate void CatShoutHandle(object sender,MyParameter para);
        private event CatShoutHandle CatShout;

        public void TestDelegate()
        {

            CatShout += new CatShoutHandle(Test_CatShout);
            MyParameter para = new MyParameter("My test Parameter Name");
            if (CatShout != null)
            {
                CatShout(this,para);
            }
        }

        void Test_CatShout(object sender, MyParameter para)
        {
            Console.WriteLine("This is my Test Delagate! Parameter's name is: {0}",para.Name);
        }

    

        static void Main()
        {

            Test c = new Test();
            c.TestDelegate();
            return;
        }
    }

  
3. 아래의 예는 이벤트를 사용하지 않고 파라미터를 포함하는 의뢰입니다
 class clsDelegate
    {
        public delegate int simpleDelegate(int a, int b);
        public int addNumber(int a, int b)
        {
            return (a + b);
        }

        public int mulNumber(int a, int b)
        {
            return (a * b);
        }

        static void Main(string[] args)
        {
            clsDelegate clsDlg = new clsDelegate();
            simpleDelegate addDelegate = new simpleDelegate(clsDlg.addNumber);
            simpleDelegate mulDelegate = new simpleDelegate(clsDlg.mulNumber);
            if (addDelegate != null && mulDelegate != null)
            {
                int addAns = addDelegate(10, 12);
                int mulAns = mulDelegate(10, 10);
                Console.WriteLine("addNum method using a delegate: {0}", addAns);
                Console.WriteLine("mulNum method using a delegate: {0}", mulAns);
                Console.Read();
            }
        }
    }

 
4. 익명 의뢰의 사용
익명 의뢰는 의뢰를 사용하는 또 다른 방식으로 익명 의뢰를 사용할 때 코드가 빨리 실행되지 않는다.컴파일러가 지정한 이름만 있는 방법을 지정했습니다.익명 방법 내부에서 안전하지 않은 코드에 접근할 수 없고, 익명 방법 외부에서ref와out 파라미터를 사용할 수 없습니다.
  // 
        private delegate void TestDelegate2(int a);
        public void Eample2()
        {
            int a = 12;
            TestDelegate2 t = delegate(int x)
            { 
                Console.WriteLine("output x : {0}", x); 
            };
            t(a);
        }

        static void Main()
        {

            Test c = new Test();
            c.Eample2();
            return;
        }

익명 의뢰 예시 2, 이전 예시와 유사
class Program  
  {       
   delegate string delegateTest(string str);      
    static void Main(string[] args)  
     {         
         string second = ",second";       
         delegateTest test =  delegate(string para)        
        {             
         para += second;      
              para += ",third";       
             return para;         
       };          
      Console.WriteLine( test("first"));
   }
}

  
5. 다음은 약간 복잡한 두 가지 예이다
1. 매개 변수 이벤트 없음
  class Program
{

static void Main(string[] args)
{
Cat cat
= new Cat("small cat");
Mouse mouse1
= new Mouse("small mouse1");
Mouse mouse2
= new Mouse("small mouse2");

// Mouse run Cat.CatShoutEventHandlerd CatShout 。
cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
cat.CatShout
+= new Cat.CatShoutEventHandler(mouse2.Run);

cat.CatShout
+= new Cat.CatShoutEventHandler(cat_CatShout);


cat.Shout();
Console.ReadLine();
}
static void cat_CatShout()
{

Console.WriteLine(
"cat is coming ,mouse3 run");
}

}

public class Cat
{
//
public delegate void CatShoutEventHandler();
public event CatShoutEventHandler CatShout;
private string _name;
public Cat(string name)
{
this._name = name;
}
public void Shout()
{
Console.WriteLine(
"miao, I am {0}", _name);
// CatShout , CatShout()
if (CatShout != null)
CatShout();
}
}
  
public class Mouse
{
private string _name;
public Mouse(string name)
{
this._name = name;
}
public void Run()
{
Console.WriteLine(
"Cat is coming, {0} run", _name);
}
}

  
2. 매개변수 이벤트가 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace weituo
{
    class Class1
    {
        static void Main(string[] args)
        {

            Cat cat = new Cat("small cat");
            Mouse mouse1 = new Mouse("small mouse1");
            Mouse mouse2 = new Mouse("small mouse2");

            // Mouse run Cat.CatShoutEventHandlerd CatShout 。
            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
            cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);

            cat.CatShout += new Cat.CatShoutEventHandler(cat_CatShout);

            cat.Shout();
            Console.ReadLine();
        }

        static void cat_CatShout(object sender, CatShoutEventArgs e)
        {
            Console.WriteLine("cat is coming ,mouse run");
        }

    }
    public class CatShoutEventArgs : EventArgs
    {
        private string _name;
        public CatShoutEventArgs(string name)
        {
            this._name = name;
        }

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
    public class Cat
    {

        // 
        public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs e);

        public event CatShoutEventHandler CatShout;
        private string _name;
        public Cat(string name)
        {
            this._name = name;
        }


        public void Shout()
        {
            Console.WriteLine("miao, I am {0}", _name);
            CatShoutEventArgs e = new CatShoutEventArgs(_name);
            // CatShout , CatShout()
            if (CatShout != null)
                CatShout(this, e);

        }

    }

    public class Mouse
    {
        private string _name;
        public Mouse(string name)
        {
            this._name = name;
        }

        public void Run(object sender, CatShoutEventArgs args)
        {
            Console.WriteLine("Cat {0} is coming, {1} run", args.Name, _name);
        }
    }
}

  
3. WPF의 이벤트
 3.1 public Window1()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(Init);
        }
        void Init(object sender, RoutedEventArgs e)
        {
            button2.Click += new RoutedEventHandler(button2_Click);
            button3.Click += new RoutedEventHandler(button3Click);
        }
        void button3Click(object sender, RoutedEventArgs e)
        {
             MessageBox.Show("testbutton3"); 
       }
        void button2_Click(object sender, RoutedEventArgs e)
        {
           MessageBox.Show("testbutton2"); 
        }

3.2 Dispatcher Timer의 사용.지정된 시간 간격과 지정된 우선 순위로 처리되는 Dispatcher 대기열에 통합된 타이머입니다.
DispatcherTimer timer = new DispatcherTimer();

timer.Interval
= TimeSpan.FromSeconds(1);

this.Loaded += delegate

{

  
//

  button2_Click();

  timer.Stop();

};

timer.Start();

6. EventHandler 일반 의뢰
    class EventHandlerTest
    {
        public static void TestEventHandler()
        {
            HasEvent has = new HasEvent();
            has.SampleEvent += new EventHandler<MyEventArgs>(has_SampleEvent);
            has.EventTest("work smart!");
            has.EventTest("work hard!");
        }

        static void has_SampleEvent(object sender, MyEventArgs e)
        {
            Console.WriteLine(e.Message);
        }
    }

    public class MyEventArgs:EventArgs
    {
        private string msg;

        public MyEventArgs(string message)
        {
            msg = message;
        }
        public string Message
        {
            get { return msg; }
            set { msg = value; }
        }
    }

    public class HasEvent
    {
        public event EventHandler<MyEventArgs> SampleEvent;

        public void EventTest(string str)
        {
            EventHandler<MyEventArgs> myEvent = SampleEvent;
            if (myEvent != null)
            {
                myEvent(this, new MyEventArgs(str));
            }
        }
    }

  
 
 
 

좋은 웹페이지 즐겨찾기