> 백엔드 개발 > C#.Net 튜토리얼 > C# 학습일지 19----대표자(Delegate) 유형의 참조 유형

C# 학습일지 19----대표자(Delegate) 유형의 참조 유형

黄舟
풀어 주다: 2017-01-21 15:11:48
원래의
1710명이 탐색했습니다.

대리자 유형의 의미는 참조 유형의 서문에 소개되었습니다(보려면 클릭하세요). 즉, 대리자 유형을 사용하면 해당 메소드를 다른 메소드의 매개변수로 전달할 수 있습니다. . 직설적으로 말하자면, 메소드는 매개변수로 전달될 수 있습니다. 모든 대리자(Delegate)는 System.Delegate 클래스에서 파생됩니다.

(이해가 안가는 것 같네요.) 룸메이트 HC555는 LoL 매니아이고 타오바오 쇼핑을 좋아하는데, LoL에 푹 빠져 있을 때 택배기사님이 택배로 전화를 주셨어요. 배달, 게임할 때 제일 귀찮은 게 이거라서 택배를 돌려달라고 하더군요. 이때 룸메이트를 (룸프렌드)급으로 간주하고 택배를 받는 것도 학원에서의 방법입니다. 클래스(takepackage())이고 Delegate(메서드를 전달할 수 있는 객체)에 의해 인스턴스화된 객체이며, 룸메이트로부터 빠른 배송을 받는 메소드를 "운반"합니다.

대리자 선언:

대리자의 선언에 따라 대리자가 참조할 수 있는 메서드가 결정됩니다. 대리자는 동일한 레이블이 있는 메서드를 가리킬 수 있습니다.

예를 들어 다음과 같이 대리자를 선언합니다.

    public delegate int MyDelegate(string str); //string类型的变量就是它的标签
로그인 후 복사

위 대리자는 단일 문자열 매개변수를 사용하고 int 유형 변수를 반환하는 모든 메서드를 참조하는 데 사용할 수 있습니다.

대리자 인스턴스화:

대리자는 메서드의 형식입니다. 대리자 형식이 선언되면 새 개체를 사용하여 대리자 개체를 만들어야 합니다. 키워드로, 특정 메소드와 관련된 새로운 키워드로 생성되어야 합니다. 대리자를 만들 때 메서드는 매개 변수 없이 변수로 새 문에 전달됩니다. 예:

  public delegate int MyDelegate(string str);  //委托的声明
           .....   
           public static int Add(string s);   //定义的一个方法
         .....   
         MyDelegate my = new MyDelegate(Add) ;  //实例化一个委托,其实就是实例化一个对象
로그인 후 복사

코드 예:

특급 배송을 픽업하는 원래 스토리로 돌아가서 이 스토리를 코드로 변환했습니다.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{   
    public delegate void MyDelegate(string str);    //委托的声明  
  
    class roomfriend  //定义室友这个类  
    {   
        public static void takepackage(string name)  //定义一个取快递的方法  
        {  
           Console.WriteLine("我叫 {0} 这是一个取快递方法",name);  
            
        }  
    }  
    class program  
    {  
        static void Main(string[] args)  
        {  
            MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入)  
            myd("HC555");   //由我实现室友的方法,实际是室友的方法当参数传给了我  
        }  
    }  
}
로그인 후 복사

결과는 이렇습니다.


C# 학습일지 19----대표자(Delegate) 유형의 참조 유형

택배를 받고 기숙사로 돌아오는데 룸메이트가 전화해서 말하더군요. 배가 고프다며 슈퍼마켓을 지나갈 때 먹을 것을 사오라고 하더군요. 레이펑의 정신으로 동의했는데... 여기서 '뭔가를 사는 것'도 룸프렌드에서는 수단으로 볼 수 있고, '나'도 마찬가지입니다. 그의 방법에서 또 다른 것을 "운반"합니다. C#에서는 "+="를 사용하여 병합 메서드를 순차적으로 연결하고, 호출 시 순차적으로 출력해 보셨나요? 아직... 0.0)

위에서는 "를 사용합니다. +=" 메소드를 연결합니다. 메소드를 취소하려면 자연스럽게 "-="를 사용하여 "I"와의 연결을 취소할 수 있습니다. 관계를 유지하므로 위 코드에서는 myd -= roomfriend 만 추가하면 됩니다. .takepackage // express를 취하는 메소드가 다시 호출되지 않도록 += 아래에 넣습니다.

C# 학습일지 19----대표자(Delegate) 유형의 참조 유형

슈퍼마켓에서 비스킷 몇 상자를 샀는데 또 룸메이트의 전화가 울렸다. 그 사람은 그 소포가 여자 친구를 위한 것이라고 말하며 나에게 배달해 달라고 요청했다. 예전에는 좋은 사람들이 그걸 고수할 텐데 나도 동의했어요. . 여자친구에게 택배를 배달할 때, 그녀는 급해서 비스킷 상자를 포함한 내 모든 물건을 서둘러 가져갔습니다. . 그리고는 웃으며 행복하게 기숙사로 돌아왔습니다... 여기서는 수락(accept) 메소드를 갖는 또 다른 (여자친구) 클래스를 정의하고, 메소드의 매개변수로 나(delegate)를 사용합니다. > 정의 방법: public static void accept(string name,MyDelegate pack); 위임을 상자로 생각하면 이 상자는 동일한 유형의 매개 변수를 가진 메서드로 가득 차 있습니다. MyDelegate pack을 문자열 이름과 비교해 보면 name은 문자열 유형의 변수이고, pack은 MyDelegate 유형의 변수라고 할 수 있습니다.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{   
    public delegate void MyDelegate(string str);    //委托的声明  
  
    class roomfriend  //定义室友这个类  
    {   
        public static void takepackage(string name)  //定义一个取快递的方法  
        {  
           Console.WriteLine("我叫 {0} 这是一个取快递方法",name);  
            
        }  
        public static void shopping(string name)   //定义一个买东西的方法  
        {  
            Console.WriteLine("我叫 {0}  这是一个买东西的方法",name);  
        }  
      
    }  
    class program  
    {  
        static void Main(string[] args)  
        {  
            MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入)  
            
            myd += roomfriend.shopping;    // += 合并运算顺序执行方法   
            myd("HC555");  
        }  
    }  
}
로그인 후 복사
결과는 같습니다

반성:

위에서 제시한 예에서는 "룸메이트" 또는 "룸메이트의 여자친구"가 클래스로 간주됩니다. 메소드를 호출할 때 메소드 이름을 사용하고, 인스턴스화된 객체를 사용하는 경우 객체 이름을 전달합니다. . 대리자에 전달할 메소드 이름 참조 메소드:

roomfriend myfriend = new roomfriend(); // 룸메이트를 객체로 인스턴스화

MyDelegate myd = new MyDelegate(myfriend.tackpackage ; 코드에서 takepackage를 Public 액세스로 선언했지만 여전히 private 필드로 컴파일되는 것으로 나타났습니다. 이는 메서드를 정의할 때 사용한 정적 항목과 관련이 있습니다(제거된 경우 자세히 설명). 가능합니다.

위는 C# 학습일기 19의 내용입니다.---참조형 위임(Delegate)형에 대한 자세한 내용은 PHP 중국어 홈페이지(www. php.cn)!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿