2017-11-08 1 views
-1

이미 코드에 함수가있을 때 대리자에 대해 함수 서명을 두 번 선언하지 마십시오. 나는 명백한 무엇인가 놓치고있는 것처럼 느낀다. 그러나 나는 인터넷 검색으로 이것을하는 방법을 발견 할 수 없다.C#에서 기존 함수에서 대리자 서명 선언

public class SomeLibraryV1 
{ 
    public int DoSomething(int x, int y); 
} 

public class SomeLibraryV2 
{ 
    public int DoSomething(int x, int y); 
} 

public class SomeConsumer 
{ 
    // Create the delegate by manually declaring the signature again :-(
    private delegate int DoSthDelegate(int x, int y); 

    public void Run(DoSthDelegate aDelegate) 
    { 
    aDelegate(1, 2); 
    } 
} 

그래서 난 그냥 int fn(int, int)의 두 번째 선언을 피하면된다 싶은 것.

public class SomeConsumer 
{ 
    // Create the delegate from the function signature we already know :-) 
    public delegate DoSthDelegate(SomeLibrary.DoSomething); 

    public void Run(DoSthDelegate aDelegate) 
    { 
    aDelegate(1, 2); 
    } 
} 

이런 일이 두 번 매일 선언을 입력 저를 절약 할뿐만 아니라,하지만 날 두 곳에서 일을 유지하는 데 절약 할 수 DoSomething 변화의 서명이 있어야합니다.

+0

a func ? –

+0

OK 그리고 SomeLibrary 선언에서 어떻게 얻습니까? –

+1

무슨 뜻인지 알지만 실행하기 전에이 작업을 수행 할 수있는 방법을 모르겠습니다. 나는 네가 여기 명시해야만한다고 생각해. '''Func <>'''은 당신에게 어떤 타이핑을 저장할 수 있습니다. –

답변

0

대리인에게 중요한 점은 말할 것도없고 실마리가 없습니다. 메서드를 동일한 서명으로 등록 할 수 있습니다. 따라서 단 하나의 수정 방법에만 대리인을 바인딩하는 것은 도움이되지 않습니다. 같은 메서드를 호출하는 경우에만 대리자를 사용하면 안됩니다. 간단하게 전화 당신의 DoSomething -method 대신 직접 대리자를 호출하여 Run -method의 :

Run() 
{ 
    var retVal = DoSomething(3, 5) 
} 

는 사실 대리인뿐만 아니라 여러 방법으로 만족스러운 할 수있다 서명에 불과하다. 또한 이는 동일한 위임자 정의를 통해 여러 이벤트 처리기를 등록 할 수있는 이벤트의 기초입니다.

그래서 모든 대리인은 두 개의 int 값을 예상하고 int를 반환하는 메서드가 있음을 나타냅니다. 그러나이 나던이 메소드가 정의되는 위치에 어떤 가정을 - 그것도 익명의 하나, 예컨대 : 물론

Run((x, y) => x + y); 

이 일부 중복 입력됩니다 수 있습니다. 그러나 위임자 서명에 맞지 않는 메서드를 호출 할 수 없습니다. 그래서 당신이 할 수있는 유일한 방법은 만드는 대신 Func -delegate을 사용하는 것입니다 자신의 하나 또한

Run(instanceOfMyLibrary.DoSomething); 

나 :

Func<int, int, int> f = instanceOfyLibrary.DoSomething; 
Run(f); 

public TheFunc Func<int, int, int> { get; set; } 

당신이 문을 통해이 작업을 설정할 수 있습니다

주의 : 위임자는 Run -method에 매개 변수로 제공하기 위해 public이어야합니다.

+0

분명히 대리인을 사용할 실제 이유가 있습니다. 예제를 간략하게 설명했습니다. 질문에 대한 답변이 있으십니까? SomeLibrary.DoSomething의 서명에서 TheFunc를 어떻게 만들 수 있습니까? –

+0

나는 델리게이트 선언에 대해 이야기하고 있는데, 이제는 어떻게 선언 할 것인가 ... –

+0

당신은 DoSomething을 실행하고 싶지는 않지만 "SomethingDifferent"를 상상해보십시오. 위임자는 서명을 모두 만족하기 때문에 DoSomething 또는 SomethingDifferent 중 하나를 호출 할 수 있어야합니다. 대리 메서드를 수정 메서드에 바인딩하면 대리자가 쓸모 없게됩니다. 이것을 말하면서 delegates 시그니처를 explicitely * 정의해야합니다. – HimBromBeere

관련 문제