2011-07-14 4 views
0

Duplicate possible:
What is Delegate?C question # délégué

En C#, un délégué peut être vu à la fois comme nom de la méthode et le nom du type. Est-ce que je comprends bien?

comme "doShow [] = new articles doShow [3];" dowShow est un nom de type. comme "doShow (nouvelle Class1() ....)" dosShow est un nom de méthode/

Je reçois cette conclusion en lisant ici les codes:

public class TestDelegate 
{ 
    // define a datatype as a method taking a string returning void 
    public delegate void doShow(String s); 

    public static void Main(string[] args) 
    { 
     // make an array of these methods 
     doShow[] items = new doShow[3]; 

     items[0] = new doShow(new Class1().show); 
     items[1] = new doShow(new Class2().display); 
     items[2] = new doShow(Class3.staticDisplay); 

     // call all items the same way 
     for(int i = 0; i < items.Length; i++) { 
      items[i]("Hello World"); 
     } 
    } 
} 
+3

penser à elle comme un type qui décrit un procédé; pas une méthode réelle. Le délégué dit que la méthode * which * est appelée (ou une méthode anonyme). Autrement dit, on pourrait dire que c'est un pointeur de fonction fortement typé. – vcsjones

+0

En termes simples, vous pouvez supposer que les délégués sont des conteneurs pour les signatures de méthodes. C'est une sorte de lien invisible avec la méthode que vous souhaitez invoquer. – AbrahamJP

Répondre

5

Oui. Un type de délégué est un type. Une instance d'un type délégué peut être appelée comme une méthode avec (méthode syntaxe myDelegate(arg1, arg2)). Un délégué peut être considéré comme un pointeur de méthode fortement typé (d'où le Type).

0

Si je ne me trompe pas, délégué est toujours un type, mais son exemple peut être associé à une méthode avec la signature identique. C'est ce que vous voyez dans le code ci-dessus.

doShow est un type et ses instances (en utilisant le nouvel opérateur) sont associés aux méthodes adoptées en tant que paramètres au constructeur du délégué.

Vijay

0

Vous ne devriez pas penser délégués eux-mêmes comme des « méthodes », même si vous pouvez cas d'utilisation d'entre eux dans la même façon. Ce ne sont pas des méthodes, ce sont des types.

Ils sont un type particulier, les instances qui peuvent contenir des références à des méthodes. Le "nom" que vous donnez à un délégué n'est pas un nom de méthode, c'est un nom de type, comme n'importe quelle classe, enum, etc. Ce type décrit un objet qui peut être exécuté en l'appelant, comme une méthode.

Il est important de faire la distinction entre un délégué et « un nom de méthode » pour plusieurs raisons:

  1. Plus important encore - ne pas utiliser le nom du type de délégué lui-même pour appeler les méthodes associées. Vous utilisez le nom de l'instance. Compte tenu de votre échantillon, vous ne pouvez pas dire:

    doShow("Hi"); 
    
  2. Un délégué peut contenir une référence à une méthode anonyme qui n'a pas de nom, comme:

    doShow s = delegate (string s) { Console.WriteLine(s); }; 
    
  3. Un délégué peut contenir une référence à un expression lamba, qui est interne juste une façon différente d'écrire une méthode délégué anonyme, mais superficiellement est complètement différente:

    doShow s = x => Console.WriteLine(x); 
    
  4. délégués multidestinataire (tels que les gestionnaires d'événements) peuvent contenir des références à plus d'une méthode à la fois, y compris toute combinaison de méthodes nommées, des méthodes anonymes ou lambas.

    myObject.MyEvent += ObjectEvent; 
    myObject.MyEvent += delegate (object sender, EventArgs e) { Console.WriteLine("Hi"); } 
    myObject.MyEvent += (sender, e) => Console.WriteLine("Hi again.");