2010-11-30 10 views
0

Ich versuche, Code zu lesen, den ich nicht geschrieben habe. Im Hauptteil der Klasse gibt es die folgenden 2 Zeilen.Eine Frage zu Delegaten

// RenderingService callbacks 
protected RenderingServiceResponsesDelegate renderingServiceResponsesDelegate; 
public delegate void RenderingServiceResponsesDelegate(Collection<RenderingServiceResponse> responses); 

Nun, ich habe noch nie verwendet Delegierten in C#, lesen Sie aber, dass drei Schritten besteht (Erklärung, Instanziierung und Aufruf). Die zweite Zeile sieht wie die Deklaration aus und die erste Zeile sieht wie der erste Schritt der Instanziierung aus. Innerhalb der Konstruktor der Klasse gibt es die folgende Zeile:

//Inside the constructor 
this.renderingServiceResponsesDelegate = renderingServiceResponsesDelegate; 

wo renderingServiceResponsesDelegate der Parameter durch den Konstruktor übergeben wird. Das wäre also der zweite Teil der Instanziierung. Ist das richtig verstanden? Ich war verwirrt von der Reihenfolge der Dinge. Ist es möglich, es so in C# zu instanziieren, bevor es deklariert wurde?

Antwort

2

Die zweite Zeile ist die Deklaration des TypsRenderingServiceResponsesDelegate.

Die erste Zeile ist die Deklaration von eine Variable mit diesem Typ. Es ist nicht die Instanziierung.

Die Zeile innerhalb des Konstruktors weist der Variablen einen Wert zu, aber in Ihrem Beispiel wird dieser Wert von woanders empfangen. Instanziierung bedeutet das Erstellen einer Instanz, die oft mit dem Schlüsselwort new erfolgt. In Ihrem Beispiel haben Sie den Code nicht angegeben, in dem die Instanziierung ausgeführt wird.

+0

Ok:

SomeClassThatHasTakesTheDelegateInstance c = new SomeClassThatHasTakesTheDelegateInstance (new RenderingServiceResponsesDelegate (this.SomeMethodThatMatchesTheDelegateSignature)); 

Ein Aufruf dann wie folgt aussehen würde. Ich habe den Code ausgewählt, weil er sehr groß ist. Es gibt eine andere Klasse, die diese Klasse instanziiert. Er übergibt eine Methode, die in ihrer eigenen Klasse deklariert ist. Die Zeile lautet: this.RenderingServiceResponseCallback –

+0

Vielen Dank. Ich denke, ich verstehe jetzt den Code und den Grund dafür, dass er so strukturiert ist. –

2

Dies ist die Erklärung des Typs Delegierten:

public delegate void RenderingServiceResponsesDelegate(Collection<RenderingServiceResponse> responses); 

Dies ist die Erklärung eines Mitglieds, das aus diesem Delegattyp ist:

protected RenderingServiceResponsesDelegate renderingServiceResponsesDelegate; 

Dies ist die Zuordnung einer zuvor instanziiert Instanz zu diesem Mitglied:

this.renderingServiceResponsesDelegate = renderingServiceResponsesDelegate; 

renderingServiceResponsesDelegate verweist auf a spezifische Methode einer Objektinstanz oder einer statischen Methode.

Die bisherige Instanciation wie dies hätte aussah:

this.renderingServiceResponsesDelegate(someResponses); 
+0

Ja. Vielen Dank. Die andere Klasse, die diese Klasse aufruft, hat eine Methode namens RenderingServiceResponseCallback. Diese Methode wird als Parameter übergeben, der wiederum dem Delegaten zugewiesen wird. Ich hoffe, das ist richtig verstanden. –