2010-10-21 7 views
7

bei der Implementierung/Verwendung von Methoden, die Instanzen von Objekten zurückgeben oder damit arbeiten, was ist der eleganteste Ansatz zur Überprüfung der Funktionsparameter?Die beste Methode zum Überprüfen von Funktionsparametern: Auf Null prüfen oder versuchen/fangen

Methode aufzurufen:

someType GetSomething(object x) 
{ 
    if (x == null) { 
     return; 
    } 

    // 
    // Code... 
    // 
} 

oder besser:

someType GetSomething(object x) 
{ 
    if (x == null) { 
     throw new ArgumentNullException("x"); 
    } 

    // 
    // Code... 
    // 
} 

Aufruf Methode:

void SomeOtherMethod() 
{ 
    someType myType = GetSomething(someObject); 

    if (someType == null) { 
     return; 
    } 

} 

oder besser:

void SomeOtherMethod() 
{ 
    try { 
     someType myType = GetSomething(someObject); 
    } catch (ArgumentNullException) { 
    } 
} 

Wenn Sie ähnliche Fragen durchgehen, ist der Grund, try/catch nicht zu verwenden, die Leistung. Aber IMHO sieht der Versuch-Fang einfach besser aus :).

Also, welcher Weg ist "eleganter"?

Antwort

8

Wenn die Übergabe in einer null nicht gültig ist, werfen Sie eine Ausnahme (d. H. - dies ist eine Ausnahmesituation, die niemals passieren sollte).

Wenn ein null Parameter gültig ist, geben Sie ein entsprechendes Objekt zurück.

Im Allgemeinen akzeptieren null Parameter ist schlechte Praxis - es geht gegen das Prinzip der geringsten Überraschung und erfordert den Anrufer wissen, dass es gültig ist.

+0

Funktionen, die Nicht-Null-Eingaben auswerten und Null für Null-Eingaben zurückgeben, sind oft ein nützliches Muster. In einigen Fällen mag das Null-Objektmuster schöner sein, aber es kann schwierig sein, es mit Generika zu implementieren. – supercat

2

Sie sollten Ausnahmen nur für Ausnahmefälle verwenden. Wenn Sie erwarten, dass das Argument (legitimerweise) null ist, sollten Sie es überprüfen - verwenden Sie keine Ausnahmen dafür. IMO sollten Sie am aufrufenden Standort (vor dem Aufruf der Aufruf) auf null überprüfen, wenn es nicht sinnvoll ist, null an Ihre Methode zu übergeben.

0

In Ihrem Beispiel ist GetSomthing privat. Dies bedeutet, dass Sie alle Anrufer aufspüren und sicherstellen können, dass Nullwerte z.

Wenn es jedoch nicht wirklich privat ist, dann sollten Sie tun, wie Oded und andere sagten. Überprüfen Sie, ob es Null ist, und werfen Sie in den meisten Fällen eine ArgumentationException.

4

Was die Eleganz angeht, ist es schwierig, Code Contracts zu übertreffen.

Verwandte Themen