2010-09-20 17 views
6

C# Delegierte waren immer schwierig für mich zu erfassen und so war ich sehr glücklich über logicchild's article on The Code Project web site titled "C# Delegates: Step by Step" zu stolpern. Er hat eine sehr prägnante Art, C# -Teilnehmer zu erklären, und ich kann es Ihnen empfehlen. Um jedoch die Beispiele auszuprobieren, ich sehe, dass es zwei Möglichkeiten, einen Delegierten zu initialisieren, vor allem:Was ist der "richtige" Weg, einen C# -Delegaten zu initialisieren?

//create a new instance of the delegate class 
    CalculationHandler sumHandler1 = new CalculationHandler(math.Sum); 
    //invoke the delegate 
    int result = sumHandler1(8, 9); 
    Console.WriteLine("Result 1 is: " + result); 

und

CalculationHandler sumHandler2 = math.Sum; 
    //invoke the delegate 
    int result = sumHandler2(8, 9); 
    Console.WriteLine("Result 2 is: " + result); 

, wo die Mathematik in der Klasse als

public class Math 
{ 
    public int Sum(int x, int y) 
    { 
     return x + y; 
    } 
} 
definiert ist

Also was ist der "richtige" Weg und warum?

Antwort

7

Sie sind beide korrekt, aber method group conversion, die zweite Option wurde in 2.0 (IIRC) hinzugefügt. I.e. Wenn Sie eine alte Version des Compilers verwenden, müssen Sie die erste Option verwenden. Ansonsten ist die zusätzliche Eingabe wirklich überflüssig.

3

Ich verwende immer die erste Methode aus Gründen der Lesbarkeit. Die zweite Option zeigt, dass math.Sum eine Eigenschaft ist und ein Ergebnis zurückgibt, bei dem es sich um einen CalculationHandler handelt. Ich persönlich finde das verwirrend.

+6

Whoa. Viele Verbrechen werden begangen "Aus Gründen der Lesbarkeit", und prominent unter ihnen ist das Schreiben langer, gewundener Code statt klarer, prägnanter Code. Das ist das Gegenteil von Lesbarkeit. –

+0

Spaß Ich benutze die zweite für die Lesbarkeit. Geht nur um zu zeigen, dass die Lesbarkeit ist subjektiv –

+1

@Konrad, lang ist nicht automatisch gleich verschlungen. Und short ist nicht automatisch gleich lesbar. RegEx kommt mir in den Sinn ... Tatsache ist, dass der "längere" Weg der Arbeitsweise von C# genauer folgt. Der kürzere Weg ist möglicherweise verwirrend. Ich würde kaum CalculationHandler sumHandler1 = new CalculationHandler (math.Sum) nennen; ein Verbrechen. – colithium

0

Beide Möglichkeiten sind OK, kurze Version ist nur C# Compiler-Service. Der erste Weg ist ausführlicher und zeigt genau, was passiert. Beide Versionen erzeugen den gleichen IL-Code, der der ersten Version nahe kommt.

1

Beide sind richtig.

Die zweite ist eine Verknüpfung vom Compiler zur Verfügung gestellt, beide tatsächlich den Code der ersten erstellen.

Die erste zeigt deutlicher, was tatsächlich passiert, während die zweite weniger Code ist, so dass es einfacher zu lesen ist (sobald Sie verstehen, was wirklich passiert).

1

Persönlich bevorzuge ich die zweite Option (Methodengruppe Konvertierung). Aus funktionaler Sicht interessiert mich der Typ des Delegaten nicht, da ich dadurch keine Hinweise darauf erhält, was die dem Delegat zugewiesene Methode beim Aufruf tut. Der Methodenname wird (zumindest sollte) mir jedoch eine gute Vorstellung davon geben, was passieren wird, wenn der Delegat aufgerufen wird, und in der zweiten Option muss ich nicht nach dem Methodennamen suchen.

Als eine Randnotiz wird VS Ihnen die erste Version geben, wenn Sie Autocomplete mit Event-Handler-Registrierung verwenden. Resharper verwendet den zweiten und markiert einen Teil des Codes in der ersten Version als redundant.

Verwandte Themen