18 Stimmen

Die beste Art, eine NULL zu behandeln

An der Spitze meiner Funktionen, die ich versuche, den besten Weg, um eine Null kommen in meine Verfahren in C# zu behandeln. Was ist der beste Weg für die Überprüfung und Behandlung der Null und warum? Ich habe den kompletten Code von dem, was ich gerade verwende, hinzugefügt und Resharper sagt mir, dass ich Option 1 verwenden soll. Normalerweise tue ich, was es sagt, da ich verstehe, warum es effizienter ist. Dieses Mal bin ich mir aber nicht sicher, also muss ich fragen.

Option #1
if (sender == null) return;

// Code goes here

or

Option #2
if (sender != null)
{ 
     // Code goes here
}

Complete Code
        private void EmployeeMouseHoverToolTip(object sender, EventArgs e)
        {
            if (sender != null)
            {
                var sUserIdentifier = ((C1TextBox)sender).Text;
                var userIdentifier = Guid.Empty;
                if (Utilities.IsGuid(sUserIdentifier))
                {
                    userIdentifier = new Guid(sUserIdentifier);
                }

                var toolTipText = Utilities.UserIdentifierToName(userIdentifier);
                c1SuperTooltip.SetToolTip(sender as C1TextBox, toolTipText);
            }
        }

43voto

Konrad Rudolph Punkte 503837

Der beste Code ist nicht zulassen null (anstelle dessen, was Sie gerade tun). Dies ist nicht immer möglich (manchmal ist es wichtig, die null in einer sinnvollen Weise) - aber in den meisten Fällen ist es so.

Dann müssen Sie (in der defensiven Codierung) nur noch eine null prüfen und eine Ausnahme auslösen:

if (arg == null)
    throw new ArgumentNullException("arg");

Viele (wenn nicht sogar die meisten) Methoden im .NET-Framework und in guten Bibliotheken tun dies auf diese Weise.

Abgesehen davon, dass die sender eines Ereignisses sollte jamais sein null und ich würde sagen, dass ein Check dafür überflüssig ist. Wenn null an dieses Ereignis übergeben wird, ist etwas mit Ihrem Code nicht in Ordnung.

Die Art und Weise, wie Sie mit null (indem man ihn stillschweigend schluckt und nichts tut) kann schwerwiegende Fehler in der Anwendung verbergen und ist selten, wenn überhaupt, angebracht. Fehler im Code sollten verdächtiges Verhalten hervorrufen und nicht unter den Teppich gekehrt werden.

11voto

Arafangion Punkte 10934

Warum nicht einfach so tun, dass eine Null-Referenz nie auftritt, und die NullPointerException nicht abfangen?

Sie erhalten einen Stack-Trace, eine Vielzahl von Informationen, und es wird als Ausnahme behandelt.

9voto

Rob Punkte 44368

Option 1 wird meiner Meinung nach von resharper vorgeschlagen, weil sie den Code leichter lesbar macht. Sie werden am Ende mit:

  • Weniger Einrückungen
  • Code, der seine Anforderungen durchsetzt und auf sie gleich am Anfang der Methode reagiert (wenn der Absender null ist, gebe ich sofort zurück)
  • Code, der im Allgemeinen leichter zu pflegen ist, weil er klarer ist

Was die Leistung anbelangt, gibt es wahrscheinlich kaum einen Unterschied (aber wenn es für Sie wichtig ist, es messen ). Es gibt nichts, was den JIT-Compiler davon abhalten könnte, die eine Form in die andere umzuschreiben, wenn sie nicht ohnehin vom C#-Compiler als identische MSIL ausgegeben werden.

7voto

Jordão Punkte 53117

Dies ist ein Ereignishandler, er sollte nur von Steuerelementen als Reaktion auf ein Ereignis aufgerufen werden (niemals direkt von Ihrem eigenen Code), daher sollten Sie sich nicht um Nullprüfungen oder sogar Typprüfungen auf der sender Parameter (wenn Sie diesen Event-Handler nur an denselben Typ von Steuerelement anhängen). Ich würde es einfach so machen:

private void EmployeeMouseHoverToolTip(object sender, EventArgs e) {  
  var txtBox = (C1TextBox)sender;
  var sUserIdentifier = txtBox.Text;
  var userIdentifier = Utilities.IsGuid(sUserIdentifier) ? 
    new Guid(sUserIdentifier) : 
    Guid.Empty;
  var toolTipText = Utilities.UserIdentifierToName(userIdentifier);
  c1SuperTooltip.SetToolTip(txtBox, toolTipText);
}

Ich würde sogar noch einen Schritt weiter gehen und die Logik zum Abrufen des Tooltip-Textes von der Logik zum Lesen und Aktualisieren der Benutzeroberfläche trennen. Etwas wie dies:

private void EmployeeMouseHoverToolTip(object sender, EventArgs e) {  
  var txtBox = (C1TextBox)sender;
  var toolTipText = ResolveUpdatedTooltipText(txtBox.Text);
  c1SuperTooltip.SetToolTip(txtBox, toolTipText);
}

private string ResolveUpdatedTooltipText(string sUserIdentifier) {
  var userIdentifier = ResolveGuid(sUserIdentifier);
  return Utilities.UserIdentifierToName(userIdentifier);
}

private Guid ResolveGuid(string sUserIdentifier) {
  return Utilities.IsGuid(sUserIdentifier) ? 
    new Guid(sUserIdentifier) : 
    Guid.Empty;
}

Daher sollten Sie keine der von Ihnen angegebenen Optionen verwenden.

5voto

FastAl Punkte 6056

Überprüfen Sie es nicht.

Wenn Sie Nullen erhalten, haben Sie den Handler zu etwas hinzugefügt, das Sie nicht haben sollten. Und wenn ein anderer Fehler dies verursacht, sollten Sie Behandlung mit dem globalen Exception-Handler von WinForms, damit das Programm nicht abstürzt , protokollieren Sie es und laden Sie die Protokolle auf Ihre Website hoch, um nach solchen Fehlern zu suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X