모든 이벤트(event)는 특수한 형태의 Delegate이다. c# delegate 기능은 경우에 따라 잘못 사용될 소지가 있다.

 

예시 코드

area = new MyArea();

            area.MyClick += Area_Click;
            area.MyClick += AfterClick;

            area.Show();

            // 실수로 '=' 연산자를 사용해 MyClick은 Area_Click메서드만 갖는다.
            area.MyClick = Area_Click;

            // 클래스 외부에서 호출할 수 있다.
            area.MyClick(null);

 

위의 문제점을 극복하기 위해 c# event를 사용할 수 있다.

c# event는 할당연산자(=)를 사용할 수 없고, 오직 (+=, -=)만을 사용할 수 있다. 그리고 delegate와 달리 해당 클래스 외부에서는 직접 호출할 수 없다.

class MyArea : Form
    {
        public MyArea()
        {
            // 이 부분은 당분간 무시 (무명메서드 참조)
            // 예제를 테스트하기 위한 용도임.
            this.MouseClick += delegate { MyAreaClicked(); };
        }

        public delegate void ClickDelegate(object sender);

        // Event 필드
        public event ClickDelegate MyClick;


        // 예제를 단순화 하기 위해
        // MyArea가 클릭되면 아래 함수가 호출된다고 가정
        void MyAreaClicked()
        {
            if (MyClick != null)
            {
                MyClick(this);
            }
        }
    }

    class Program
    {
        static MyArea area;

        static void Main(string[] args)
        {
            area = new MyArea();

            area.MyClick += Area_Click;
            area.MyClick += AfterClick;

            area.MyClick -= Area_Click;
            // 이벤트 직접호출 불가하기에 에러 뜸
            //area.MyClick(this);

            area.ShowDialog();
        }

        static void Area_Click(object sender)
        {
            area.Text = "MyArea 클릭!";
        }

        static void AfterClick(object sender)
        {
            area.Text += " AfterClick 클릭! ";
        }
    }

 

'게임 프로그래밍 > C#' 카테고리의 다른 글

구조체와 클래스 차이  (0) 2021.11.12
델리게이트  (0) 2021.11.12
func, Action 델리게이트  (0) 2021.11.12
Interface  (0) 2021.11.12
일반화 컬렉션  (0) 2021.11.12
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
위와 같은 스크립트 코드를 추가하면 H2가 두 개 이상이거나 H3가 두 개 이상인 경우 첫 번째 H2 헤딩 태그 앞에 목차를 표시합니다. 만약 H2가 한 개도 없으면 목차가 표시되지 않습니다. H3 이상부터 있는 경우에는 코드를 조금 수정해야 합니다. 다음과 비슷하게 하면 잘 작동합니다.