c# delegate 예제

멤버 함수를 가리킬 수 있는 것은 좋지만 대리자를 사용하여 수행할 수 있는 더 많은 트릭이 있습니다. C#에서 대리자는 멀티캐스트로, 즉 한 번에 둘 이상의 함수를 가리킬 수 있습니다(즉, System.MulticastDelegate 형식을 기반으로 합니다). 멀티캐스트 대리자는 대리자가 호출될 때 모두 호출되는 함수 목록을 유지 관리합니다. 첫 번째 예제에서 로깅 함수에 다시 추가하고 두 대리자를 호출할 수 있습니다. 코드의 모양은 다음과 같습니다: 이벤트를 만들고 시작하는 간단한 예제가 있습니다. 난수가 생성됩니다. 숫자가 5와 같으면 FiveEvent 이벤트가 생성됩니다. 여기서 멋진 부분은 Process() 함수를 변경할 필요가 없다는 것입니다. 모든 대리자에 대한 코드는 정적 함수또는 멤버 함수를 참조하는지 여부에 관계없이 동일합니다. 대리인은 호출될 때 두 개 이상의 메서드를 호출할 수 있습니다.

이를 멀티캐스팅이라고 합니다. 대리자의 메서드 목록(호출 목록)에 추가 메서드를 추가하려면 추가 또는 추가 할당 연산자(`+` 또는 `+=`)를 사용하여 두 명의 대리자를 추가하기만 하면 됩니다. 예: 시스템 사용; System.IO 사용; 네임스페이스 Akadia.SimpleEvent { /* ========이벤트 게시자 ============================** 공용 클래스 MyClass {// LogHandler라는 대리자를 정의합니다. 로그 핸들러(문자열 메시지); 위의 대리자 공용 이벤트 LogHandler 로그에 따라 이벤트를 정의합니다. Process() 함수가 대리자 // 매개 변수로 사용되는 대신 로그 이벤트를 선언했습니다. XXXX가 이벤트의 이름인 OnXXXX 메서드를 사용하여 이벤트를 호출합니다. 공개 무효 프로세스() { OnLog(„프로세스() 시작“); 온로그(„프로세스() 끝“); } // 기본적으로 OnXXXX 메서드를 만들어 이벤트 보호 된 Void OnLog (문자열 메시지) { IF (Log != null) { Log(메시지); } } FileLogger 클래스는 파일 I/O 공용 클래스 FileLogger { FileStream 파일스트림을 캡슐화할 뿐입니다. 스트림라이터 스트림라이터; 생성자 공개 FileLogger (문자열 파일 이름) { fileStream = 새 FileStream (파일 이름, FileMode.Create); streamWriter = 새 StreamWriter (fileStream); } // 멤버 함수 대리자 공용 void Logger (문자열 s) { streamWriter.WriteLine(들); } 공용 보이드 닫기() { streamWriter.Close(); fileStream.Close(); } /* ==========이벤트의 구독자 ============================//// 이제 는 공공 클래스 TestApplication {정적 Void Logger(문자열 s) {를 관리해야 하는 대신 이벤트에 대한 대리자의 인스턴스 ///를 추가하는 것이 더 쉽고 깨끗해졌습니다. 콘솔.쓰기 라인(들); } 정적 보이드 Main(문자열[] args) { FileLogger fl = 새 FileLogger(„process.log“); MyClass myClass = 새 MyClass(); 함수 로거와 fl을 구독합니다. 로거 myClass.Log += 새 MyClass.LogHandler(로거); myClass.Log += 새 MyClass.LogHandler(fl) 로거); 이제 이벤트는 process() 메서드 myClass.Process()에서 트리거됩니다. 플로리다.

닫기(); } } } 위에서 로깅 예제를 수정하여 대리자가 아닌 이벤트를 사용하겠습니다. System.IO 사용; 네임 스페이스 Akadia.SimpleDelegate { // 대리자 사양 공용 클래스 MyClass {// 단일 문자열 매개 변수를 사용 하 고 반환 형식이 없는 대리자를 선언 합니다. 함수를 직접 // 함수를 호출하기 전에 대리자가 null // (즉, 함수를 가리키지 않음)인지 확인하기 위해 검사를 추가해야합니다. 공개 보이드 프로세스(LogHandler logHandler) { 경우 (logHandler != null) { logHandler(„Process(„Process() 시작“); } (logHandler != null) { logHandler („Process() 끝“); } } FileLogger 클래스는 파일 I/O 공용 클래스 FileLogger { FileStream 파일스트림을 캡슐화할 뿐입니다. 스트림라이터 스트림라이터; 생성자 공개 FileLogger (문자열 파일 이름) { fileStream = 새 FileStream (파일 이름, FileMode.Create); streamWriter = 새 StreamWriter (fileStream); } // 멤버 함수 대리자 공용 void Logger (문자열 s) { streamWriter.WriteLine(들); } 공용 보이드 닫기() { streamWriter.Close(); fileStream.Close(); } Main()은 대리자가 FileLogger의 fl 인스턴스에서 Logger(/ // 함수)를 가리키도록 수정됩니다.