ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1074)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (349)
      • C++ (168)
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (10)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 파이썬
  • Unity
  • 포인터
  • 프로그래머스
  • 그래픽스
  • 오블완
  • 백준
  • 유니티
  • 언리얼
  • 배열
  • 알고리즘
  • 함수
  • string
  • C++
  • C
  • SQL
  • c#
  • 문자열
  • 클래스
  • 티스토리챌린지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/C#

C# Delegate Event 사용법

2022. 6. 8. 20:29

delegate 는 메서드를 가리킬 수 있는 타입의 간편 표기법.

event도 간편표기법. event를 사용하면 정형화된 콜백 패턴을 구현하려할때 코드를 줄일 수 있음.

- 조건

1. 클래스에서 이벤트(콜백)를 제공한다.

 

2. 외부에서 자유롭게 해당 이벤트(콜백)을 구독하거나 해지하는 것이 가능하다.

 

3. 외부에서 구독/해지는 가능하지만 이벤트 발생은 오직 내부에서만 가능하다.

 

4. 이벤트의 첫번째 인자는 이벤트를 발생시킨 타입의 인스턴스다.

 

5. 이벤트의 두번째 인자는 해당 이벤트에 속한 의미 있는 값이 제공된다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp
{
    // 부모클래스는 사라지고 닷넷에서 제공하는 System.EventArgs라는 타입 사용
    class PrimeCallbackArg : EventArgs
    {
        public int prime;
 
        public PrimeCallbackArg(int _prime) { this.prime = _prime; }
    }
    // 소수 생성기
    class PrimeGenerator
    {
        //기존의 AddDelegate, RemoveDelegate,PrimeDelegate는 없어짐.
        public event EventHandler PrimeGenerated;
 
        // 주어진 수까지 루프를 돌면서 소수가 발견되면 콜백메서드 호출 ****
        public void Run(int _limit)
        {
            for (int i = 2; i <= _limit; i++)
            {
                // 콜백을 발생시킨 측의 인스턴스와 발견된 소수를 콜백메서드에 전달
                if (Is_prime(i) && 
                    PrimeGenerated != null)
                    PrimeGenerated(this, new PrimeCallbackArg(i));
            }
        }
        //소수 판정 메서드
        public bool Is_prime(int _candidate)
        {
            if ((_candidate & 1) == 0)
                return _candidate == 2;
 
            for (int i = 3; (i * i) <= _candidate; i += 2)
            {
                if ((_candidate % i) == 0) 
                    return false;
            }
            return _candidate != 1;
        }
    }
    class Program
    {
        static int sum;
 
        //콜백으로 등록될 메서드1
        static void Print_prime(object _sender, EventArgs _arg) { Console.Write((_arg as PrimeCallbackArg).prime + ", "); }
 
        //콜백으로 등록된 메서드2
        static void Sum_prime(object _sender, EventArgs _arg) { sum += (_arg as PrimeCallbackArg).prime; }
 
        static void Main(string[] args)
        {
            PrimeGenerator gen = new PrimeGenerator();
 
            gen.PrimeGenerated += Print_prime;
            gen.PrimeGenerated += Sum_prime;
 
            // 1~10까지 소수를 구하고
            gen.Run(10);
            Console.WriteLine();
            Console.WriteLine(sum);
 
            //Sum prime 콜백메서드 제거후 1~15사이 소수 구하는 메서드 호출
            gen.PrimeGenerated -= Sum_prime;
            gen.Run(15);
        }
    }
}

 

출처 : https://jeong-pro.tistory.com/54?category=788886

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

C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값  (0) 2022.06.19
C# 제네릭 (C++ > 템플릿)  (0) 2022.06.13
C# 사용자 정의 전환 연산자(암시적/명시적)  (0) 2022.06.08
C# LINQ  (0) 2022.06.07
C# 형변환 is as 키워드  (0) 2022.06.05
    '프로그래밍 언어/C#' 카테고리의 다른 글
    • C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값
    • C# 제네릭 (C++ > 템플릿)
    • C# 사용자 정의 전환 연산자(암시적/명시적)
    • C# LINQ
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바