2010-02-19 8 views
5

Warum ist es notwendig, eine Funktion STATIC während der Verwendung von Delegaten in C# zu erstellen?Warum kann ein Delegat nicht auf eine nicht statische Methode verweisen, wenn er in einer statischen Methode verwendet wird?

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

Weil Sie versuchen, es in einem statischen Kontext von Main zu referenzieren? – captncraig

+2

Ich leugne die Prämisse der Frage; Es ist * nicht * notwendig, die Methode statisch zu machen. Es ist notwendig, dem Delegierten genügend Informationen bereitzustellen, um die Methode erfolgreich aufzurufen; Bei nicht statischen Methoden gehört dazu auch das Bereitstellen der Instanz, die den nicht statischen Methodenaufruf empfängt. –

Antwort

11

Es ist nicht "notwendig". Aber Ihre Main Methode ist static, so kann es nicht eine non static Methode aufrufen. Versuchen Sie so etwas wie dieses (das ist nicht wirklich ein guter Weg, um Dinge Sie zu tun wirklich eine neue Klasse erstellen sollte, aber nicht Ihre Probe viel ändern):

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

Gute Arbeit, die Ihren eigenen Anspruch mit Code widerlegt. Clearly Main (eine statische Methode) verweist auf Execute (eine Instanzmethode), indem sie aufgerufen wird. Die korrekte Anweisung wäre "Damit eine statische Methode oder Methode einer anderen Klasse auf eine Instanzmethode verweist, muss sie die Instanz bereitstellen". Instanzmethoden innerhalb derselben Klasse müssen auch eine Instanz bereitstellen, wenn sie auf eine Instanzmethode verweisen (überprüfen Sie die IL, um dies zu sehen), aber der C# -Compiler ist standardmäßig auf "this" gesetzt, wenn Sie keine angeben. –

8

Ihre Funktion statisch sein muss, weil Du rufst von einer statischen Methode an, Main. Sie können die Methode nicht statisch machen:

class Program 
{ 
    delegate int Fun (int a, int b); 
    static void Main(string[] args) 
    { 
     Program p = new Program();  // create instance of Program 
     Fun F1 = new Fun(p.Add);   // now your non-static method can be referenced 
     int Res= F1(2,3); 
     Console.WriteLine(Res); 
    } 

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

Sie können das tun. Es gibt eine große Frage, ob Sie sollten. :) – pdr

+2

@pdr: ?? Die Frage ist, warum die Methode statisch sein muss. Meine Antwort ist, dass es nicht sein muss, und demonstriert es. – Amy

1

In diesem Fall, da Sie keine Instanz einer Klasse erstellen, die einzige Alternative ist eine statische Funktion. Wenn Sie ein Objekt vom Typ Programm instanziieren, können Sie stattdessen eine Instanzmethode verwenden.

1

Delegierte folgen grundsätzlich den gleichen Regeln wie Methoden. In diesem Beispiel muss Ihr Delegat statisch sein, da Sie ihn von einer statischen Methode aus aufrufen. Im gleichen Sinne wird dies nicht funktionieren:

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; 
} 

Allerdings, wenn Sie die Dinge in einen nicht statischen Kontext wie folgt verschoben:

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; 
    } 
} 

Sie einen Delegaten mit einer nicht-statischen Methode haben.

+0

Das ist nicht wahr, Sie können von einem statischen Kontext an eine nicht statische Methode delegieren. Z.B. MyDelegate del = foo.Bar; ist auch dann gültig, wenn Bar nicht statisch ist und die Zuweisung in einem statischen Kontext ist. –

Verwandte Themen