2010-02-19 3 views
5

왜 C#에서 대리자를 사용하는 동안 STATIC 함수를 만드는 것이 필요합니까?정적 메서드에서 사용되는 경우 대리자가 비 정적 메서드를 참조 할 수없는 이유는 무엇입니까?

class Program 
{ 
    delegate int Fun (int a, int b); 
    static void Main(string[] args) 
    { 
     Fun F1 = new Fun(Add); 
     int Res= F1(2,3); 
     Console.WriteLine(Res); 
    } 

    **static public int Add(int a, int b)** 
    { 
     int result; 
     result = a + b; 
     return result; 
    } 
} 
+0

Main에서 정적 컨텍스트로 참조하려고하기 때문에? – captncraig

+2

나는이 질문의 전제를 부정한다. 메서드를 정적으로 만들 필요는 없습니다. 대리자가 메서드를 성공적으로 호출하기에 충분한 정보를 제공해야합니다. 비 정적 메소드 호출을 수신하는 인스턴스를 제공하는 것을 포함하는 비 정적 메소드의 경우. –

답변

11

"필수"는 아닙니다. 그러나 메인 메서드는 static이므로 비 static 메서드를 호출 할 수 없습니다. (이 정말 일이 - 당신이 정말로 새로운 클래스를 작성해야 할 수있는 좋은 방법은 아니지만 많은 샘플을 변경하지 않습니다) 같은 것을보십시오 :

class Program 
{ 
    delegate int Fun (int a, int b); 
    void Execute() 
    { 
     Fun F1 = new Fun(Add); 
     int Res= F1(2,3); 
     Console.WriteLine(Res); 
    } 

    static void Main(string[] args) 
    { 
     var program = new Program(); 
     program.Execute(); 
    } 

    int Add(int a, int b) 
    { 
     int result; 
     result = a + b; 
     return result; 
    } 
} 
+1

코드로 자신의 주장을 입증하는 것이 좋습니다. 분명 Main (정적 메서드)은 Execute (인스턴스 메서드)를 호출하여 참조합니다. 올바른 설명은 "인스턴스 메서드를 참조하는 정적 메서드 또는 다른 클래스의 메서드 인 경우 인스턴스를 제공해야합니다."입니다. 동일한 클래스 내의 인스턴스 메소드는 인스턴스 메소드를 참조 할 때 인스턴스를 제공해야합니다 (IL을 확인하여 확인하십시오). 그러나 C# 컴파일러는 기본적으로 "this"를 지정하지 않습니다. –

8

함수 때문에 정적 필요 당신은 정적 방법에서 전화하고 있습니다, 마인. 메서드를 비 정적으로 만들 수 있습니다.

+0

그렇게 할 수 있습니다. 당신이해야하는지의 큰 질문이 있습니다. :) – pdr

+2

@ pdr : ?? 문제는 그 방법이 정적이어야한다는 것입니다. 내 대답은 그것이 있어야 할 필요가 없다는 것입니다. – Amy

1

이 경우 모든 클래스의 인스턴스를 만들지 않으므로 정적 함수 만 사용할 수 있습니다. Program 유형의 객체를 인스턴스화했으면 대신 인스턴스 메서드를 사용할 수 있습니다.

1

대표자는 기본적으로 메소드와 동일한 규칙을 따릅니다. 제공된 예제에서 대리자는 정적 메서드에서 호출하기 때문에 정적이어야합니다. 같은 맥락에서이 작동하지 않습니다

static void Main(string[] args) 
{ 
    int Res = Add(3, 4); 
    Console.WriteLine(Res); 
} 

public int Add(int a, int b) 
{ 
    int result; 
    result = a + b; 
    return result; 
} 

을이 같은 비 정적 컨텍스트에 물건을 이동하지만 경우 :

class MyClass 
{ 
    public MyClass() 
    { 
     Fun F1 = new Fun(Add); 
     int Res = F1(2, 3); 
     Console.WriteLine(Res); 
    } 

    public int Add(int a, int b) 
    { 
     int result; 
     result = a + b; 
     return result; 
    } 
} 

당신은 비 정적 메서드에 대리자를 가질 수있다.

+0

정적 컨텍스트에서 비 정적 메서드에 위임 할 수는 없습니다. 예 : MyDelegate del = foo.Bar; Bar가 정적이 아니고 할당이 정적 컨텍스트에있는 경우에도 유효합니다. –

관련 문제