2010-12-09 5 views
3

Hallo Ich habe mein Problem in folgenden Code-Snippet zusammengefasst. Im ersten Code habe ich einen Delegierten und ein Ereignis in der gleichen Klasse deklariert, während in Code 2 ich Delegat und Ereignis in separate Klasse deklariert habe.Delegierte Deklaration

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

     } 
    } 
} 

Jetzt habe ich eine ques Gibt es irgendeinen Unterschied (wie thread-safe, Performance) zwischen diesen beiden Code-Snippets?

+0

define 'Unterschied'! –

+0

@Andreas: Wie Thread-Sicherheit, Leistung. –

+2

Anders als ein paar Dinge sind in verschiedenen Klassen definiert? –

Antwort

2

Der einzige Unterschied scheint die Verwendung einer separaten Klasse zu sein. Also nein: Solange die Methoden und Typen zugänglich sind, gibt es sehr wenig funktionelle Unterschiede.

Als Randbemerkung, können Sie Action<string> für einen Delegierten zu prüfen, die eine string nimmt und void, aber beachten Sie auch, dass die Ereignisse sollten allgemein das (object sender, SomeEventArgsClass e) Muster folgen

(wo SomeEventArgsClass:EventArgs, vielleicht auch EventHandler<T> verwenden)
+0

Danke Marc zur Klarstellung. –

2

Eigentlich gibt es keinen Unterschied, aber Sie sollten Delegaten außerhalb von Klassen definieren, da ein Delegat eine Klasse ist (abgeleitet von Delegate).