2008-09-16 4 views
4

이것은 agsXMPP .Net 어셈블리와 함께 제공되는 예제입니다. 위임자를 읽었지만이 코드 줄 (로그온이 발생할 때까지 기다린 다음 메시지를 보내는 방법)에 맞는 방법이 확실하지 않습니다. 내가 찾고있는 것은 이유에 대한 이해입니다. delegate(0) 이 간단한 용어의 종류에 내가 이해할 수 수행합니다. 익명 함수를 만드는이 코드 줄 (C#)에서이 대리자 호출은 무엇을하고 있습니까?

xmpp.OnLogin += delegate(object o) { 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), 
    MessageType.chat, 
    "Hello, how are you?")); 
}; 

답변

1

delegate(object o){..} 객체가이 경우에, 나중에 실행하기로 괄호 안에 무엇이든 패키징하도록 컴파일러에 지시 인 경우 그것은 정확히

xmpp.OnLogin += EventHandler(MyMethod); 

과 동일합니다 OnLogin가 해고되었을 때. delegate() 문이 없으면 컴파일러는 assignemnt 문 중간에 작업을 실행하고 오류를 줄 것을 생각합니다.

+1

가장 훌륭한 대답 중에서 가장 모호한 것을 골랐습니다. – FlySwat

0

합니다.이 기능에 소개 된 C# 2.0

0

그것은 익명 메소드의 역할을, 그래서 당신은하지 않습니다

그런 경우 해당 작업을 작업 목록에 추가하는 것이 좋습니다. t는 onLogin 이벤트로 인해 트리거됩니다.

4

MyMethod라는이

public void MyMethod(object o) 
{ 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
} 
+0

익명 메소드에서 대리인이 정의 된 범위의 로컬 변수에 액세스 할 수 있기 때문에 완전히 똑같지는 않습니다. – Ishmaeel

+0

당신이 맞습니다,이 예제에서는 – juan

+0

입니다. 나는 EventHandler 전에 새로운 것이 필요하다고 생각합니다. 그리고 EVentHandler는 EventArgs 매개 변수를 기대합니다. 어쨌든 객체 매개 변수를 조절하는 새로운 델리게이트 유형을 선언해야합니다. Remi의 대답 –

0

아베와 동의하면 익명의 방법입니다. 익명 메소드는 매개 변수 인수로 제공 될 수있는 이름없는 메소드입니다.

분명히 OnLogin 개체는 이벤트입니다. + = 연산자를 사용하면 OnLogin 이벤트가 발생할 때마다 위의 익명 대리자에 의해 지정된 메서드가 실행됩니다.

0

기본적으로 {} 내의 코드는 xmpp 이벤트의 "OnLogin"이벤트가 발생하면 실행됩니다. 이름을 기반으로, 나는 로그인 프로세스 중 어느 시점에 이벤트가 발생했다고 추측 할 수 있습니다.

구문 :

delegate(object o) { statements; } 

는 익명의 호출 방법이다. 귀하의 질문에 해당하는 코드는 다음과 같습니다.

public class MyClass 
{ 
    private XMPPObjectType xmpp; 
    public void Main() 
    { 
    xmpp.OnLogin += MyMethod; 
    } 
    private void MyMethod(object o) 
    { 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
    } 
} 
0

xmpp에서 OnLogin 이벤트에 가입하고 있습니다.

이것은 xmpp가이 이벤트를 발생 시키면 익명의 대리자 내부의 코드가 실행된다는 것을 의미합니다. 콜백을 갖는 우아한 방법. XMPP에서

,이 같은 일이 벌어지고 : 아베가 언급 한 바와 같이

// Check to see if we should fire the login event 
    // ALso check to see if anything is subscribed to OnLogin 
    // (It will be null otherwise) 
    if (loggedIn && OnLogin != null) 
    { 
     // Anyone subscribed will now receive the event. 
     OnLogin(this); 
    } 
2

는,이 코드는 익명 함수를 만드는 것입니다. 이것은 :


xmpp.OnLogin += delegate(object o) 
    { 
     xmpp.Send(
     new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
    }; 

은 이전 버전에서 다음과 같이 수행되었습니다.순 (I 클래스 선언을 제외하며, 단지 필수 요소를 유지했습니다) :


delegate void OnLoginEventHandler(object o); 

public void MyLoginEventHandler(object o) 
{ 
     xmpp.Send(
     new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
} 

[...] 

xmpp.OnLogin += new OnLoginEventHandler(MyLoginEventHandler); 

당신은 XMPP OnLogin 이벤트가 발생할 때 실행할 당신의 방법을 연관되어 어느 경우에 무슨 일을하는지. , 질서가 이벤트에 가입하는 것을 의미

public delegate void LoginEventHandler(Object o); 

: LoginEventHandler는 대리자 형식과 같습니다

public event LoginEventHandler OnLogin; 

아마로 선언 : XMPP에

2

OnLogin 이벤트는 다음과 같이 선언 아마 LoginEventHandler 대리자 서명과 일치하는 메서드 (또는 anonymous method/lambda expression)를 제공해야합니다.

xmpp.OnLogin += delegate(object o) 
       { 
        xmpp.Send(new Message(new Jid(JID_RECEIVER), 
           MessageType.chat, 
           "Hello, how are you?")); 
       }; 

익명 방법은 OnLogin 이벤트 (무효 반환 형식 + 하나 개의 오브젝트 인수)로 예상 위임 서명과 일치 : 당신의 예에서

, 당신은 delegate 키워드를 사용하여 익명 메소드를 전달합니다. 또한 contravariance을 사용하는 object o 매개 변수는 익명 메소드 본문 내부에서 사용되지 않으므로 제거 할 수 있습니다.

xmpp.OnLogin += delegate 
       { 
        xmpp.Send(new Message(new Jid(JID_RECEIVER), 
           MessageType.chat, 
           "Hello, how are you?")); 
       }; 
관련 문제