2010-12-09 7 views
3

Salut J'ai résumé mon problème dans l'extrait de code suivant. Dans le premier code j'ai déclaré un délégué et un événement dans la même classe alors que dans Code 2 j'ai déclaré délégué et événement dans une classe séparée.Déclaration de délégué

code 1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     delegate void Greeting(string s); 
     event Greeting myEvent; 
     void OnFire(string s) 
     { 
      if (myEvent != null) 
       myEvent(s); 

     } 
     static void Main(string[] args) 
     { 
      Program obj = new Program(); 
      obj.myEvent += new Greeting(obj_myEvent); 
      obj.OnFire("World"); 
     } 

     static void obj_myEvent(string s) 
     { 
      Console.WriteLine("Hello " + s + "!"); 
     } 
    } 
} 

Code 2

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DelegateDemo obj = new DelegateDemo(); 
      obj.myEvent+=new DelegateDemo.Greeting(obj_myEvent); 
      obj.OnFire("World"); 
     } 

     static void obj_myEvent(string s) 
     { 
      Console.WriteLine("Hello "+s +"!"); 
     } 
    } 
} 

DelegateDemo.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    public class DelegateDemo 
    { 
     public delegate void Greeting(string s); 
     public event Greeting myEvent; 
     public void OnFire(string s) 
     { 
      if (myEvent != null) 
       myEvent(s); 

     } 
    } 
} 

Maintenant, j'ai une ques Y a-t-il des différences (comme la sécurité des threads, les performances) entre ces deux extraits de code?

+0

définir 'différence'! –

+0

@Andreas: Comme la sécurité du fil, la performance. –

+2

Autre que quelques choses sont définies dans différentes classes? –

Répondre

2

La seule différence semble être l'utilisation d'une classe distincte. Donc non: tant que les méthodes et les types sont accessibles, il y a très peu de différence fonctionnelle.

Comme une note de côté, vous pouvez envisager Action<string> un délégué qui prend un string et retourne void, mais il faut noter aussi que les événements doivent généralement suivre le modèle (object sender, SomeEventArgsClass e) (où SomeEventArgsClass:EventArgs, en utilisant peut-être aussi EventHandler<T>)

+0

Merci Marc pour la clarification. –

2

En fait il n'y a pas de différence, mais vous devez définir des délégués en dehors des classes car un délégué EST une classe (dérivant de Delegate).