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

0voto

tia Punkte 9085

Ich behandle Null nicht für private Methoden, da ich immer sicherstelle, dass kein Nullwert an meine privaten Methoden gesendet wird. Wenn etwas schief gelaufen ist und der Wert Null an die private Methode übergeben wurde, wird die Ausnahme ausgelöst, wie es sein sollte, und ich weiß, dass ich etwas falsch gemacht habe. Wenn Sie bei privaten Methoden immer auf den Wert Null prüfen, übersehen Sie möglicherweise einen logischen Fehler zur Laufzeit und wissen erst dann, dass Sie einen Fehler in Ihrem Code haben, wenn er Sie in der Produktion trifft.

0voto

Micah Punkte 106323

Eine Variante von Option 1, die entweder sofort zurückkehrt oder eine Ausnahme auslöst. Der Trick besteht darin, zu wissen, welche Methode zu verwenden ist. Meine Faustregel ist, dass, wenn es Teil einer öffentlichen Schnittstelle ist, dann werfen eine Ausnahme. Wenn es sich um etwas handelt, über das Sie tief in Ihrem Framework die Kontrolle haben, dann kehren Sie einfach sofort zurück und behandeln die Null-Referenz auf dieser Ebene.

public void IHaveNoControlOverWhereThisMethodIsCalled(object arg)
{
    if(arg == null)
        throw new ArgumentNullException("arg");    
}

private void TheOnlyCallersOfThisMethodComeFromMe(object arg)
{
    //I should do all my public parameter checking upstream and throw errors
    //at the public entry point only.
    if(arg == null)
         return;

}

Im speziellen Fall Ihres Event-Handlers:

private void EmployeeMouseHoverToolTip(object sender, EventArgs e)
{
    var txtSender = sender as C1TextBox;
    if(txtSender == null) return;

    var sUserIdentifier = txtSender.Text;
    var userIdentifier = Guid.Empty;
    if (Utilities.IsGuid(sUserIdentifier))
    {
        userIdentifier = new Guid(sUserIdentifier);
    }

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

0voto

Ramesh Punkte 12657

Option 1 würde wohl die zyklomatische Komplexität verringern. Bei Option 2 würde eine weitere Wenn-Bedingung unter die Wenn-Klausel fallen und die Komplexität erhöhen.

0voto

Nix Punkte 54370

Die Auswirkungen auf die Leistung sind minimal, daher würde ich mir darüber keine Sorgen machen. Option 1 ist besser, weil sie besser lesbar und weniger trüb ist...

Besser lesbar, da die Bedingung nicht negiert wird und es keinen unnötigen Bereichsblock gibt.

0voto

Justin Niessner Punkte 235353

Wenn Sie nicht gehen, um eine Null-Sender zu behandeln, dann würde ich mit der ersten Option gehen (und stellen Sie sicher, es ist die erste Zeile in der Handler, so dass es nicht von anderen Code versteckt).

Wenn Sie denken, Sie können einen Null-Sender schließlich behandeln, würde ich mit der zweiten Option gehen, da es bietet Ihnen eine bessere Möglichkeit, Dinge sowie die Aufrechterhaltung einer einzigen Rückgabepunkt für den Handler zu behandeln.

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