2017-12-06 39 views
0

Ich schreibe eine Funktion, die überprüft, ob eine Ausgabe DBNull ist, und gibt null zurück, wenn der generische Typ nullfähig ist. Wenn nicht, wird einfach der Fehler ausgelöst.Gibt null zurück, wenn der generische Typ nullfrei sein kann

Update: hinzugefügt Alle Empfehlungen

public T Get<T>(string key) 
{ 
    int ordinal = reader.GetOrdinal(key); 
    if (reader.IsDBNull(ordinal)) 
    { 
     if (typeof(T).GetTypeInfo().IsValueType && Nullable.GetUnderlyingType(typeof(T)) == null) // isn't a nullable field 
      throw new InvalidCastException(); 
     else return default(T); 
    } 
    return reader.GetFieldValue<T>(ordinal); 
} 

Jedoch habe ich, wenn default(T) kehrt null für jeden Nullable-Feld bin nicht sicher. Wenn es jetzt einen anderen Weg gibt, es null zurückgeben zu lassen?

+2

Ich bin nicht sicher, ob 'reader.GetFieldType (key) 'würde normalerweise' DBNull' zurückgeben - funktioniert das überhaupt? Ich würde * erwarten *, dass etwas zurückgegeben wird, das darstellt, was die Spalte enthalten würde * wenn es nicht null wäre * –

+0

Genau wie ein Vorschlag (zusätzlich zu Marc's Antwort/Kommentar), invertiere die 'if' Anweisung (wenn es * nicht ist * null, 'return ...;'), und entferne die 'else's für nur einen' throw ...; ' –

Antwort

5

Ja, default(T) ist die richtige Art von null -ähnlichen Wert für jeden T, die tatsächlich ein SomeType?/Nullable<SomeType> ist, also was Sie sollte gut funktionieren haben. obwohl

Vielleicht möchten Sie Dinge beachten, wie string und byte[] - diese können auch aus Datenbanken kommen und null sein kann.

Sie könnten auch darüber nachdenken, was der Fehler sein sollte, wenn jemand einfach einen Fehler macht und fragt <int>, wenn der Wert <decimal> ist. Das würde InvalidCastException verursachen. Es gibt eine Methode IsDBNull() auf IDataReader, die geeigneter als die Verwendung der Ausnahme sein könnte.

Schließlich: bevorzugen throw; zu throw e;

+1

[Gibt es einen Unterschied zwischen" throw "und" throw ex "?] (https : //stackoverflow.com/a/730255/209259). –

+0

@ShaiCohen Ich habe Marc's Antwort auf diese Frage in meinem Kommentar verlinkt. Es war für das OP nicht ich :) –

2

In Bezug auf den Computer-Ressourcen, Auffangen und Handhabung eine Ausnahme eine extrem teuere Aufgabe. Ihre Methode verwendet die Ausnahme als Teil ihres Logikflusses. Dies ist eine falsche Betrachtungsweise des Problems, das Sie lösen möchten.

Darüber hinaus fangen Sie speziell InvalidCastException Ausnahmen. Diese Ausnahme kann in anderen Fällen als dem Versuch, eine Nullreferenz zu übertragen, auftreten. Sie verstecken einen potenziell gültigen Fehler/stellen ihn falsch dar; etwas, das viele Stunden frustrierenden Debugging kosten kann.

Das folgende sollte Ihnen das gleiche Verhalten wie die ursprüngliche Methode geben, aber ohne den Overhead des Abwickelns des Stapels während der integrierten Fehlerbehandlung.

Verwandte Themen