블로그 이미지
따시쿵

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2015. 6. 4. 12:10 C#

프로그램 설명


EventHandler 와 EventHandler<TEventArgs> Delegate 를 비교하여 설명하는 예제입니다.

  • EventHandler Delegate  - 이벤트 데이터가 없는 이벤트를 처리할 메서드를 나타냅니다.
  • EventHandler<TEventArgs> Delegate - 이벤트가 데이터를 제공할 때 이벤트를 처리할 메서드를 나타냅니다.

1. EventHandler delegate


구문


[SerializableAttribute]

[ComVisibleAttribute(true)]

public delegate void EventHandler(

Object sender,

EventArgs e

)



매개 변수


sender

형식: System.Object

이벤트 소스입니다. 


e

형식: System.EventArgs

이벤트 데이터가 포함되지 않은 개체입니다. 


설명


.NET Framework의 이벤트 모델은 이벤트와 이벤트 처리기를 연결하는 이벤트 대리자가 있다는 사실을 기초로 만들어졌습니다. 이벤트를 발생시키려면 다음과 같은 두 가지 요소가 필요합니다.


  • 이벤트에 응답하는 메서드를 식별하는 대리자입니다.
  • 이벤트 데이터를 제공 하는 경우 이벤트 데이터를 보유하 고 필요한 경우는 클래스입니다.


대리자는 시그니처를 정의하는 형식, 즉 메서드에 대한 반환 값 형식과 매개 변수 목록 형식입니다. 대리자 형식을 사용하여 대리자와 같은 시그니처가 있는 모든 메서드를 참조하는 변수를 선언할 수 있습니다.


이벤트 처리기 대리자의 표준 시그니처에서 값을 반환 하지 않는 메서드를 정의 합니다. 


첫 번째 매개 변수 형식이 Object 이벤트를 발생 시키는 인스턴스를 참조 합니다. 

두 번째 매개 변수 형식에서 파생 된 EventArgs 및 이벤트 데이터를 보유 합니다. 이벤트에서 이벤트 데이터를 생성 하지 않습니다 두 번째 매개 변수는 단순히 값의 경우는 EventArgs.Empty 필드입니다. 그렇지 않으면 두 번째 매개 변수에서 파생 된 형식입니다 EventArgs 하 고 모든 필드 또는 속성은 이벤트 데이터를 보관 하는 데 필요한을 제공 합니다.


EventHandler 대리자는 특별히 데이터를 생성 하지 하는 이벤트에 대한 이벤트 처리기 메서드를 나타내는 미리 정의된 대리자입니다. 


이벤트를 처리할 메서드와 이벤트를 연결하려면 대리자의 인스턴스를 해당 이벤트에 추가합니다. 대리자를 제거하지 않는 경우, 이벤트가 발생할 때마다 이벤트 처리기가 호출됩니다.


예제

    class Program
    {
        #region Event Publisher
        class Publisher
        {
            public event EventHandler Somethinghappened;

            public void DoSometing()
            {
                EventHandler hanlder = Somethinghappened;
                if (hanlder != null)
                    hanlder(this, EventArgs.Empty);
            }
        }
        #endregion

        #region event Subscriber
        class Subscriber
        {
            public void HanldeEvent(object sender, EventArgs e)
            {
                Console.WriteLine("Something happened to " + sender.ToString());
                Console.ReadLine();
            }
        }
        #endregion

        static void Main(string[] args)
        {
            Publisher publisher = new Publisher();
            Subscriber subscriber = new Subscriber();
            publisher.Somethinghappened += subscriber.HanldeEvent;

            publisher.DoSometing();
        }
    }

소스 파일 : 

MyEventHandler2.zip



2. EventHandler<TEventArgs> delegate


구문


[SerializableAttribute]

public delegate void EventHandler<TEventArgs>(

Object sender,

TEventArgs e

)



형식 매개 변수

TEventArgs

이벤트에서 생성한 이벤트 데이터의 형식입니다.


매개 변수

sender

형식: System.Object

이벤트 소스입니다.

e

형식: TEventArgs

이벤트 데이터를 포함하는 개체입니다. 



설명


.NET Framework의 이벤트 모델은 이벤트와 이벤트 처리기를 연결하는 이벤트 대리자가 있다는 사실을 기초로 만들어졌습니다. 이벤트를 발생시키려면 다음과 같은 두 가지 요소가 필요합니다.


  • 이벤트에 응답하는 메서드를 참조하는 대리자입니다.
  • 이벤트 데이터를 제공 하는 경우 이벤트 데이터를 보유하고 필요한 경우는 클래스입니다.


대리자는 시그니처를 정의하는 형식, 즉 메서드에 대한 반환 값 형식과 매개 변수 목록 형식입니다. 대리자 형식을 사용하여 대리자와 같은 시그니처가 있는 모든 메서드를 참조하는 변수를 선언할 수 있습니다.


이벤트 처리기 대리자의 표준 시그니처에서 값을 반환 하지 않는 메서드를 정의 합니다. 


첫 번째 매개 변수 형식이 Object 이벤트를 발생 시키는 인스턴스를 참조 합니다. 

두 번째 매개 변수 형식에서 파생 된 EventArgs 및 이벤트 데이터를 보유 합니다. 

이벤트에서 이벤트 데이터를 생성 하지 않습니다 두 번째 매개 변수는 단순히 값의 경우는 EventArgs.Empty 필드입니다. 그렇지 않으면 두 번째 매개 변수에서 파생 된 형식입니다 EventArgs 하 고 모든 필드 또는 속성은 이벤트 데이터를 보관 하는 데 필요한을 제공 합니다.


EventHandler<TEventArgs> 대리자는 미리 정의 된 데이터를 생성 하는 이벤트에 대한 이벤트 처리기 메서드를 나타내는 대리자입니다. 


이벤트에서 이벤트 데이터를 생성할 때 EventHandler<TEventArgs>을 사용하면 사용자 지정 대리자를 직접 코딩할 필요가 없습니다. 단순히 이벤트 데이터 개체의 형식을 제네릭 매개 변수로 제공합니다.


이벤트를 처리할 메서드와 이벤트를 연결하려면 대리자의 인스턴스를 해당 이벤트에 추가합니다. 대리자를 제거하지 않는 경우, 이벤트가 발생할 때마다 이벤트 처리기가 호출됩니다.




예제

    class Program
    {
        static void Main(string[] args)
        {
            Counter c = new Counter(new Random().Next(10));
            c.ThresholdReached += c_ThresholdReached;

            Console.WriteLine("press 'a' key to increase total");
            while (Console.ReadKey(true).KeyChar == 'a')
            {
                Console.WriteLine("adding one");
                c.Add(1);
            }            
        }

        static void c_ThresholdReached(object sender, ThresholdReachedEventArgs e)
        {
            Console.WriteLine("The threshold of {0} was reached at {1}.", e.Threshold, e.TimeReached);
            Console.ReadLine();
        }
    }

    class Counter
    {
        private int threshold;
        private int total;

        public Counter(int passedThreshold)
        {
            threshold = passedThreshold;
        }

        public void Add(int x)
        {
            total += x;
            if (total >= threshold)
            {
                ThresholdReachedEventArgs args = new ThresholdReachedEventArgs();
                args.Threshold = threshold;
                args.TimeReached = DateTime.Now;
                OnThresholdReached(args);
            }
        }

        protected virtual void OnThresholdReached(ThresholdReachedEventArgs e)
        {
            EventHandler<ThresholdReachedEventArgs> handler = ThresholdReached;
            if (handler != null)
            {
                handler(this, e);
            }
        }

        public event EventHandler<ThresholdReachedEventArgs> ThresholdReached;
    }

    public class ThresholdReachedEventArgs : EventArgs
    {
        public int Threshold { get; set; }
        public DateTime TimeReached { get; set; }
    }


소스 파일 :


MyEventHandler1.zip






'C#' 카테고리의 다른 글

람다식(Lambda Expression) - 2  (0) 2015.06.09
람다식(Lambda Expression) - 1  (0) 2015.06.08
Event 와 Delegate  (0) 2015.06.01
초단위 시간 경과 보이기  (0) 2015.05.12
로그인 창  (0) 2015.05.08
posted by 따시쿵