2010-07-23 8 views
19

Von dem, was ich gelesen habe, bin ich nicht sicher, ob ich die Namenskonvention für Ereignisse und Handler richtig habe. (Da draußen scheint es einige widersprüchliche Ratschläge zu geben).C# -Ereignisse und Handler richtig benennen

In den beiden folgenden Klassen kann mir jemand sagen, ob ich das Namensrecht für das Ereignis, die Methode, die das Ereignis auslöst, und die Methode, die das Ereignis behandelt, habe?

public class Car 
{ 
// is event named correctly? 
public event EventHandler<EventArgs> OnSomethingHasHappened; 

private void MoveForward() 
{ 
    RaiseSomethingHasHappened(); 
} 

// is the named correctly 
private void RaiseSomethingHasHappened() 
{ 
    if(OnSomethingHasHappened != null) 
    { 
    OnSomethingHasHappened(this, new EventArgs()); 
    } 
} 
} 

und die Teilnehmerklasse:

public class Subscriber() 
{ 
public Subscriber() 
{ 
    Car car = new Car(); 
    car.OnSomethingHasHappened += Car_SomethingHasHappened(); 
} 

// is this named correctly? 
private void Car_SomethingHasHappened(object sender, EventArgs e) 
{ 
    // do stuff 
} 
} 

Vielen Dank im Voraus!

+0

Teilweise dulicate: [Eigennamen für die richtige Benennung - Konvention für einen Net-Delegate-Typ] (http://stackoverflow.com/questions/2346065/proper-naming-convention-for-a-net-delegate- type) – slugster

+0

Ich stimme für das Schließen dieser Frage als Off-Topic ab, da es sich um Code-Review und nicht um ein reproduzierbares Programmierproblem handelt. –

+0

@ Cᴏʀʏ Diese Frage, wie sie derzeit geschrieben wird, wäre für [codereview.se] jedoch nicht zu hören. Platzhalter wie "SomethingHappened" machen die Überprüfung zu hypothetisch. –

Antwort

1

Ich persönlich sehe, wie Microsoft ihre Ereignisse benannt hat und wie sie ihre Handler benennen.

class Form{ 
    public event EventHandler<EventArgs> MouseMove; 
    public virtual void OnMouseMove() 
    { 
     if(MouseMove != null) 
     { 
      MouseMove(this, new EventArgs()); 
     } 
    } 
} 

class Application{ 
    public Application() 
    { 
     Form form = new Form(); 
     form.MouseMove += //Hook your own Method 
    } 
} 
5

Ich neige dazu, das Gegenteil zu tun:

public event EventHandler SomethingHappened; 

private void OnSomethingHappened() 
{ 
    SomethingHappened(); 
} 

Dann:

private void Car_SomethingHappened() 
{ 

} 

nicht das sauberste Code, aber die Namensgebung ist, wie ich es tun. Wenn es keine klarer lokaler Variablenname ist, oder es ist nicht sinnvoll, Suffix ich den Namen mit „Handler“:

private void SomethingHappenedHandler() {} 
20

Fast

Das Verfahren um das Ereignis zu feuern - On<When>Event (von RaiseSomethingHasHappened

)

dh OnBeforeOpen, OnClosing, OnSomethigHasHappened

Das Ereignis <When>Event (von OnSomethingHasHappened)

012.

dh BeforeOpen, Closing, SomethingHasHappened

der Handler <The Instance or meaningful Name><_><Event> (von Car_SomethingHasHappened)

dh Form_BeforeOpen, Window_Closing, Car_SomethingHasHappened -> perfekt

+0

+1 In einigen MS-Beispielen ist die private Ereignisauslösemethode NotifyEventName (z. B. NotifyProperyChanged). –

1

Ich würde sagen, die Namenskonvention in Ordnung ist, aber was ich vermisse in deinem Beispiel WAS ist passiert?

So würde ich mehr spezialisieren den Namen des Ereignisses selbst (wie MovedForward) oder wenn Sie es brauchen mehr verallgemeinert sollten Sie einige zusätzliche Informationen innerhalb der EventArgs darüber, was (wie die ListChanged in BindingList) geändert hat.

6

Nun, der erste Punkt ist, dass Sie Ihre eigene Namenskonvention definieren und es gibt keine "falsche" Möglichkeit, dies zu tun (solange es konsistent ist).

Nachdem gesagt, dass die Microsoft-Standards gut sind, wenn Sie Ihren Code mit anderen teilen.

Normalerweise würden Sie Ereignisse Namen wie haben:

public class Car 
{ 
// is event named correctly? 
public event EventHandler<EventArgs> SomethingHasHappened; 

private void MoveForward() 
{ 
    OnSomethingHasHappened(); 
} 

// is the named correctly 
protected virtual void OnSomethingHasHappened() 
{ 
    EventHandler<EventArgs> locum = SomethingHasHappened; 
    if(locum!= null) 
    { 
    locum(this, new EventArgs()); 
    } 
} 
} 

Beachten Sie, dass die Veranstaltung ohne die ‚On‘ Präfix trägt den Titel und die Ereignismethode Brennen ist mit dem Präfix ‚On‘ genannt. Die Ereignisauslösemethode ist auch protected virtual, sodass abgeleitete Klassen das Verhalten ändern/hinzufügen und das Ereignis selbst auslösen können, wenn es erforderlich ist.