C# 기초지식 정리 기초지식(21) 위임(2)

黄舟
풀어 주다: 2017-02-11 14:05:55
원래의
1294명이 탐색했습니다.

이전 기사에서 대리자의 사용법에 대해 http://www.php.cn/을 살펴본 후

        public void Description(string programerName, DescriptionDelegate description)
        {
            description(programerName);
        }
로그인 후 복사

가 DescriptionDelegate 설명 대리자 유형을 이 메소드에 전달하는 것을 볼 수 있습니다. , 사용하기 쉽게 몇 가지 수정하면 코드가 더 합리적이 될 것입니다. 대리자를 캡슐화한 다음 프로그래머 설명 메서드를 다른 언어로 제공합니다.
캡슐화:

    public class ProgramDescriptionDelegate2
    {
        public delegate void DescriptionDelegate(string programerName);

        public DescriptionDelegate myDelegate;

        public void Description(string programerName)
        {
            myDelegate(programerName);
        }
    }
로그인 후 복사

제안 클래스:

    public class TestDescriptionDelegate2
    {
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!", programerName));
        }

        public void Test()
        {
            ProgramDescriptionDelegate2 pe = new ProgramDescriptionDelegate2();

            pe.myDelegate = CsharpProgramer;

            pe.myDelegate += CProgramer;

            pe.Description("SamYang");
        }
    }
로그인 후 복사

이것이 더 합리적입니다. 왜냐하면 public void CsharpProgramer(string programerName ) 이러한 방법은 사용자가 언제든지 정의해야 하며 언제든지 변경되는 것으로 간주될 수 있습니다. ProgramDescriptionDelegate2는 완전히 공개 클래스이며 대리자에 바인딩된 메서드 실행만 담당합니다.
호출:

            TestDescriptionDelegate2 t = new TestDescriptionDelegate2();

            t.Test();
로그인 후 복사

출력:

ProgramDescriptionDelegate2 클래스를 다시 살펴보세요. public DescriptionDelegate myDelegate는 객체 지향 캡슐화에 따라 필드여야 합니다. 필드는 속성으로 캡슐화됩니다. 따라서 여기서는 이를 캡슐화하기 위해 매우 유용한 필드 이벤트를 사용해야 합니다.
은 다음과 같이 캡슐화됩니다.

   public class ProgramerDescriptionEvent
    {
        public delegate void DescriptionDelegate(string programerName);

        private event DescriptionDelegate myEvent;

        public event DescriptionDelegate MyEvent
        {
            add { this.myEvent += value; }

            remove { this.myEvent -= value; }
        }

        public void Description(string programerName)
        {
            myEvent(programerName);
        }
    }
로그인 후 복사

  public class TestEvent
    {
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!", programerName));
        }

        public void Test()
        {
            ProgramerDescriptionEvent pe = new ProgramerDescriptionEvent();

            pe.MyEvent += CsharpProgramer;

            pe.MyEvent += JavaProgramer;

            pe.Description("SamYang");//一般这个执行是放在引起事件执行的地方
        }
    }
로그인 후 복사

는 다음과 같이 호출됩니다.

            TestEvent te = new TestEvent();

            te.Test();
로그인 후 복사

결과는 다음과 같습니다.

다음과 같습니다. 실제로 이벤트가 무엇인지 살펴보았습니다. 기본적으로 위임이 사용되지만 이벤트를 사용하면 위임이 이벤트라는 메커니즘으로 전환됩니다.
그런 다음 msdn의 대리자 및 이벤트 설명을 살펴보세요.
이벤트는 작업 발생을 알리는 메시지를 보내는 개체입니다. 작업은 사용자 상호 작용(마우스, 키보드 작업 등)으로 인해 발생할 수 있습니다. 또는 다른 프로그램 논리 트리거에 의해. 이벤트를 캡처하고 이에 응답하는 객체를 이벤트 수신기라고 합니다.
이벤트 통신에서 이벤트 전송자 클래스는 자신이 발생시킨 이벤트를 어떤 개체나 메서드가 수신할지 알 수 없습니다. 필요한 것은 소스와 수신자 사이에 중개자가 존재하는 것뿐입니다. .NET Framework는 함수 포인터의 기능을 제공하는 특수 형식(Delegate)을 정의합니다. 대리자는 메서드에 대한 참조를 보유하는 클래스입니다. 다른 클래스와 달리 대리자 클래스에는 서명이 있으며 해당 서명과 일치하는 메서드만 참조할 수 있습니다. 이러한 방식으로 대리자는 형식이 안전한 함수 포인터 또는 콜백과 동일합니다. 대리자는 다른 용도로 많이 사용되지만 여기서는 대리자의 이벤트 처리 기능만 설명합니다. 대리자 선언은 대리자 클래스를 정의하는 데 충분합니다. 선언은 대리자의 서명을 제공하고 공용 언어 런타임은 구현을 제공합니다. 예:
public 대리자 void AlarmEventHandler(object sender, AlarmEventArgs e);
delegate 키워드는 컴파일러에 AlarmEventHandler가 대리자 유형임을 알립니다. 규칙에 따라 .NET Framework의 이벤트 위임에는 이벤트를 발생시킨 소스와 이벤트에 대한 데이터라는 두 가지 매개 변수가 있습니다. 그것은 보낸 사람과 e입니다.

위 내용은 C# 기초지식, 기초지식(21), 커미션(2) 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


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