Csharp 키워드 --- delegate (의뢰)

32435 단어 delegate
Delegate 클래스 소개      네 임 스페이스: System 프로그램 집합: mscorlib (mscorlib. dll 에서)
   의뢰 (Delegate) 클래스 는 정적 방법 이나 인 스 턴 스 및 이러한 인 스 턴 스 방법 을 참조 할 수 있 는 데이터 구조 입 니 다.기 존의 인터페이스 프로 그래 밍 에서 우 리 는 각종 유형의 이벤트 구동 (event driven) 의 처리 모델 을 접 한 적 이 있어 야 한다. 이런 모델 에서 우 리 는 해당 이벤트 가 촉발 하 는 함 수 를 정의 한다.예 를 들 어 Button 1 의 Click 사건 은 Button 1 을 작성 할 수 있 습 니 다.Click 이나 Btn1Clicked 등 함수 로 구동 처 리 를 합 니 다.이벤트 와 구동 함수 의 대응 관 계 는 의뢰 (Delegate) 클래스 를 통 해 연 결 됩 니 다.
사실 의뢰 (Delegate) 류 의 이러한 데이터 구 조 는 이전 C / C + + 의 함수 포인터 와 유사 합 니 다.
Delegate 클래스 의 간단 한 응용     1. Delegate 함수 데이터 구 조 를 정의 합 니 다. 2. Delegate 가 인용 할 정적 방법 이나 인용 클래스 인 스 턴 스 및 이러한 인 스 턴 스 방법 을 정의 합 니 다. 3. Delegate 데이터 변 수 는 인 스 턴 스 방법 을 가리 킵 니 다. 4. Delegate 데이터 변 수 를 통 해 인 스 턴 스 방법 을 실행 합 니 다.
A very basic example (TestClass.cs):
  1: using System; 

  2: 

  3: namespace MySample

  4: {

  5:     class TestClass

  6:     {

  7:     //1.    Delegate      

  8:         public delegate void GoDelegate(); 

  9: 

 10:         [STAThread]

 11:         static void Main(string[] args)

 12:         {

 13:         //3.Delegate          

 14:             GoDelegate goDelegate = new GoDelegate( MyDelegateFunc); 

 15: 

 16:         //4.  Delegate          

 17:             goDelegate();

 18:             return;

 19:         }

 20:         //2.  Delegate                      

 21:         public static void MyDelegateFunc()

 22:         {

 23:             Console.WriteLine("delegate function...");

 24:         }        

 25:     }

 26: } 
컴 파일 실행 결과:
# TestClass.exe delegate function...
Delegate 류 와 Override 를 사용 하여 다 중 비 교 를 실현 합 니 다.
1. Delegate 류 를 사용 할 때 아래 의 예 는 명확 하 게 설명 할 수 있다.  1.1 먼저 동물 기본 클래스 (MyAnimal DelegateClass) 를 정의 합 니 다. 기본 클래스 에는 속성 을 표시 하 는 (Show Animal Type) Public 방법 이 있 습 니 다.      또한 Show Animal Type 방법 에서 Delegate 가 인용 한 인 스 턴 스 방법 을 호출 합 니 다.
  1.2 사자 (LionDelegateClass) 와 말 (HorseDelegateClass) 두 개의 키 종 류 를 정의 합 니 다. Delegate 는 각자 의 인 스 턴 스 방법 과 연결 되 어 있 습 니 다.      서로 다른 속성 표시 (Show Animal Type) 방법 을 실현 합 니 다.
////Delegate example (TestClass.cs):
  1: AnonymousDelegatesusing System; 

  2: 

  3: namespace MySample

  4: {

  5:    class TestClass

  6:    {

  7:       [STAThread]

  8:       static void Main(string[] args)

  9:       {

 10:       //  (LionDelegateClass)     (ShowAnimalType)    

 11:          LionDelegateClass lionDelegate = new LionDelegateClass();

 12:          lionDelegate.ShowAnimalType("MySample"); 

 13: 

 14:       // (HorseDelegateClass)     (ShowAnimalType)    

 15:          HorseDelegateClass horseDelegate = new HorseDelegateClass();

 16:          horseDelegate.ShowAnimalType("MySample");

 17:       }

 18:    } 

 19: 

 20:    //    (MyAnimalDelegateClass)

 21:    public class MyAnimalDelegateClass

 22:    {

 23:       //Delegate      

 24:       public delegate void DelegateFunction(string strFuncName); 

 25: 

 26:       private DelegateFunction m_delegateFunction = null; 

 27: 

 28:       //Delegate     

 29:       public DelegateFunction delegateFunction 

 30:       {

 31:          get 

 32:          {

 33:             return m_delegateFunction;

 34:          } 

 35:          set 

 36:          {

 37:             m_delegateFunction = value;

 38:          }

 39:       }

 40:       //    (ShowAnimalType)  

 41:       public void ShowAnimalType(string strFuncName)

 42:       {

 43:          if (delegateFunction != null)

 44:          {

 45:             object[] args = {strFuncName};

 46:          //  Delegate       

 47:             delegateFunction.DynamicInvoke(args);

 48:          }

 49:       }

 50:    } 

 51: 

 52:    //  (LionDelegateClass)

 53:    public class LionDelegateClass:MyAnimalDelegateClass

 54:    {

 55:       public LionDelegateClass()

 56:       {

 57:          this.delegateFunction = new DelegateFunction(subFunction1);

 58:       } 

 59: 

 60:       //  (LionDelegateClass)       

 61:       private void subFunction1(string strFuncName)

 62:       {

 63:          System.Console.WriteLine(

 64:             string.Format("[{0}]This is a lion....", strFuncName));

 65:       }

 66:    } 

 67: 

 68:    // (HorseDelegateClass)

 69:    public class HorseDelegateClass:MyAnimalDelegateClass

 70:    {

 71:       public HorseDelegateClass()

 72:       {

 73:          this.delegateFunction = new DelegateFunction(subFunction2);

 74:       } 

 75: 

 76:       // (HorseDelegateClass)       

 77:       private void subFunction2(string strFuncName)

 78:       {

 79:          System.Console.WriteLine(

 80:             string.Format("[{0}]This is a horse....", strFuncName));

 81:       }

 82:    }

 83: } 
컴 파일 실행 결과:
# TestClass.exe
[MySample]This is a lion.... [MySample]This is a horse....
2. Override 실 장 을 사용 할 때 아래 의 예 를 참고 하 세 요.  1.1 먼저 동물 기본 클래스 (AbstractAnimal NoDelegateClass) 를 정의 합 니 다. 기본 클래스 에는 속성 을 표시 하 는 (Show Animal Type) Public 방법 이 있 습 니 다.      또한 Show Animal Type 방법 에서 추상 적 인 방법 (NoDelegate Function) 을 호출 합 니 다.
  1.2 사자 (LionNoDelegateClass) 와 말 (HorseNoDelegateClass) 두 개의 키 종 류 를 정의 합 니 다.      하위 클래스 에서 실제 추상 적 인 방법 (NoDelegate Function)      서로 다른 속성 표시 (Show Animal Type) 방법 을 실현 합 니 다.
////Override example (TestClass.cs):
  1: using System; 

  2: 

  3: namespace MySample

  4: {

  5:    class TestClass

  6:    {

  7:       [STAThread]

  8:       static void Main(string[] args)

  9:       {

 10:           //  (LionNoDelegateClass )     (ShowAnimalType)    

 11:           LionNoDelegateClass lionNoDelegate = new LionNoDelegateClass();

 12:        lionNoDelegate.ShowAnimalType("MySample"); 

 13: 

 14:           // (HorseNoDelegateClass )     (ShowAnimalType)    

 15:        HorseNoDelegateClass horseNoDelegate = new HorseNoDelegateClass();

 16:        horseNoDelegate.ShowAnimalType("MySample");

 17:       }

 18:    } 

 19: 

 20:    //    (AbstractAnimalNoDelegateClass)

 21:     public abstract class AbstractAnimalNoDelegateClass

 22:     {

 23:         public void ShowAnimalType(string strFuncName)

 24:         {

 25:             //    (NoDelegateFunction)  

 26:             NoDelegateFunction(strFuncName);

 27:         }

 28:         //          (NoDelegateFunction)

 29:         protected abstract void NoDelegateFunction(string strFuncName);

 30:     } 

 31: 

 32:     //  (LionNoDelegateClass )

 33:     public class LionNoDelegateClass:AbstractAnimalNoDelegateClass

 34:     {

 35:     //          (NoDelegateFunction)

 36:         protected override void NoDelegateFunction(string strFuncName)

 37:         {

 38:             System.Console.WriteLine(

 39:                 string.Format("[{0}]This is a lion....", strFuncName));

 40:         }

 41:     }

 42:    // (HorseNoDelegateClass )

 43:     public class HorseNoDelegateClass:AbstractAnimalNoDelegateClass

 44:     {

 45:     //          (NoDelegateFunction)

 46:         protected override void NoDelegateFunction(string strFuncName)

 47:         {

 48:             System.Console.WriteLine(

 49:                 string.Format("[{0}]This is a horse....", strFuncName));

 50:         }

 51:     }

 52: } 

 53: 
컴 파일 실행 결과:
# TestClass.exe
[MySample]This is a lion.... [MySample]This is a horse....
3. Delegate 와 Override 의 실제 설치 방식 비교  Delegate 의 실제 설치 방식 에서 함수 포인터 의 구성원 변 수 를 정의 하 는 것 과 같다 는 것 을 알 수 있다.  실제 함수 의 주 소 를 이 구성원 변수 에 부여 함으로써 같은 방법 을 실현 하고 처리 방식 이 다르다.  한편, Override 방식 은 부모 클래스 에서 인 터 페 이 스 를 미리 정의 하고 실제 장 치 를 통 해 다 릅 니 다.  같은 방법, 처리 방식 이 다르다.  Delegate 의 실제 포장 방식 이 비교적 유연 하고 디자인 이 완선 하지 않 은 장소 에 적합 하 며 수정 하기에 편리 하 다.  Override 방식 은 포장 성 이 좋 고 상대 적 으로 안전 합 니 다.
MulticastDelegate 류 의 응용 --- --- -----------------------------------------------------------------------------------------------------------
  1: using System; 

  2: 

  3: namespace MySample

  4: {

  5:     class TestClass

  6:     {

  7:         [STAThread]

  8:         static void Main(string[] args)

  9:         {

 10:             DogDelegateClass dogDelegate = new DogDelegateClass();

 11:             dogDelegate.ShowAnimalType("MySample"); 

 12: 

 13:     } 

 14: 

 15:     public class MyAnimalDelegateClass

 16:     {

 17:         public delegate void DelegateFunction(string strFuncName); 

 18: 

 19:         private DelegateFunction m_delegateFunction = null; 

 20: 

 21:         public DelegateFunction delegateFunction 

 22:         {

 23:             get 

 24:             {

 25:                 return m_delegateFunction;

 26:             } 

 27:             set 

 28:             {

 29:                 m_delegateFunction = value;

 30:             }

 31:         } 

 32: 

 33:         public void ShowAnimalType(string strFuncName)

 34:         {

 35:             if (delegateFunction != null)

 36:             {

 37:                 object[] args = {strFuncName}; 

 38: 

 39:                 delegateFunction.DynamicInvoke(args);

 40:             }

 41:         }

 42:     } 

 43: 

 44:     public class DogDelegateClass:MyAnimalDelegateClass

 45:     {

 46:         public DogDelegateClass()

 47:         {

 48:       //         

 49:             this.delegateFunction =  new DelegateFunction(subFunction31);

 50:             this.delegateFunction += new DelegateFunction(subFunction32);

 51:         }

 52:   //    1

 53:         private void subFunction31(string strFuncName)

 54:         {

 55:             System.Console.WriteLine(

 56:                 string.Format("[{0}]This is a dog....", strFuncName));

 57:         }

 58:   //    2

 59:         private void subFunction32(string strFuncName)

 60:         {

 61:             System.Console.WriteLine(

 62:                 string.Format("[{0}]This is a nice dog....", strFuncName));

 63:         }

 64:     }

65: }

: # TestClass.exe [MySample]

This is a dog....[MySample]This is a nice dog....

CSDN , :http://blog.csdn.net/xinsir/archive/2006/08/22/1106277.aspx

  1: // Copyright © Microsoft Corporation.  All Rights Reserved.

  2: // This code released under the terms of the 

  3: // Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)

  4: //

  5: //Copyright (C) Microsoft Corporation.  All rights reserved.

  6: 

  7: using System;

  8: using System.Collections.Generic;

  9: using System.Text;

 10: 

 11: namespace AnonymousDelegate_Sample

 12: {

 13: 

 14:     // Define the delegate method.

 15:     delegate decimal CalculateBonus(decimal sales);

 16: 

 17:     // Define an Employee type.

 18:     class Employee

 19:     {

 20:         public string name;

 21:         public decimal sales;

 22:         public decimal bonus;

 23:         public CalculateBonus calculation_algorithm;

 24:     }

 25: 

 26:     class Program

 27:     {

 28: 

 29:         // This class will define two delegates that perform a calculation.

 30:         // The first will be a named method, the second an anonymous delegate.

 31: 

 32:         // This is the named method.

 33:         // It defines one possible implementation of the Bonus Calculation algorithm.

 34: 

 35:         static decimal CalculateStandardBonus(decimal sales)

 36:         {

 37:             return sales / 10;

 38:         }

 39: 

 40:         static void Main(string[] args)

 41:         {

 42: 

 43:             // A value used in the calculation of the bonus.

 44:             // Note: This local variable will become a "captured outer variable".

 45:             decimal multiplier = 2;

 46: 

 47:             // This delegate is defined as a named method.

 48:             CalculateBonus standard_bonus = new CalculateBonus(CalculateStandardBonus);

 49: 

 50:             // This delegate is anonymous - there is no named method.

 51:             // It defines an alternative bonus calculation algorithm.

 52:             CalculateBonus enhanced_bonus = delegate(decimal sales) 

 53:             { return multiplier * sales / 10; };

 54: 

 55:             // Declare some Employee objects.

 56:             Employee[] staff = new Employee[5];

 57: 

 58:             // Populate the array of Employees.

 59:             for (int i = 0; i < 5; i++)

 60:                 staff[i] = new Employee();

 61: 

 62:             // Assign initial values to Employees.

 63:             staff[0].name = "Mr Apple";

 64:             staff[0].sales = 100;

 65:             staff[0].calculation_algorithm = standard_bonus;

 66: 

 67:             staff[1].name = "Ms Banana";

 68:             staff[1].sales = 200;

 69:             staff[1].calculation_algorithm = standard_bonus;

 70: 

 71:             staff[2].name = "Mr Cherry";

 72:             staff[2].sales = 300;

 73:             staff[2].calculation_algorithm = standard_bonus;

 74: 

 75:             staff[3].name = "Mr Date";

 76:             staff[3].sales = 100;

 77:             staff[3].calculation_algorithm = enhanced_bonus;

 78: 

 79:             staff[4].name = "Ms Elderberry";

 80:             staff[4].sales = 250;

 81:             staff[4].calculation_algorithm = enhanced_bonus;

 82: 

 83:             // Calculate bonus for all Employees

 84:             foreach (Employee person in staff)

 85:                 PerformBonusCalculation(person);

 86: 

 87:             // Display the details of all Employees

 88:             foreach (Employee person in staff)

 89:                 DisplayPersonDetails(person);

 90: 

 91: 

 92:         }

 93: 

 94:         public static void PerformBonusCalculation(Employee person)

 95:         {

 96: 

 97:             // This method uses the delegate stored in the person object

 98:             // to perform the calculation.

 99:             // Note: This method knows about the multiplier local variable, even though

100:             // that variable is outside the scope of this method.

101:             // The multipler varaible is a "captured outer variable".

102:             person.bonus = person.calculation_algorithm(person.sales);

103:         }

104: 

105:         public static void DisplayPersonDetails(Employee person)

106:         {

107:             Console.WriteLine(person.name);

108:             Console.WriteLine(person.bonus);

109:             Console.WriteLine("---------------");

110:             Console.ReadLine();

111:         }

112:     }

113: }

좋은 웹페이지 즐겨찾기