Ich werde dem Trend hier nicht zustimmen. Ich werde aufzeichnen:
Ich bin nicht der Meinung, dass dies DBNull
einem nützlichen Zweck dient. es fügt unnötige Verwirrung hinzu und trägt praktisch keinen Wert bei.
Oft wird das Argument vorgebracht, dass null
es sich um eine ungültige Referenz und DBNull
ein Nullobjektmuster handelt. beides ist nicht wahr . Zum Beispiel:
int? x = null;
Dies ist keine "ungültige Referenz". es ist ein null
Wert. In der Tat null
bedeutet dies, was immer Sie wollen, und ehrlich gesagt habe ich absolut kein Problem damit, mit Werten zu arbeiten, die möglicherweise vorhanden sind null
(sogar in SQL müssen wir korrekt arbeiten null
- hier ändert sich nichts). Ebenso ist das "Null-Objektmuster" nur dann sinnvoll, wenn Sie es tatsächlich als Objekt in OOP-Begriffen behandeln. Wenn wir jedoch einen Wert haben, der "unser Wert oder ein DBNull
" sein kann, muss dies der Fall sein object
, damit wir dies nicht können etwas Nützliches damit machen.
Es gibt so viele schlechte Dinge mit DBNull
:
- es zwingt dich zu arbeiten
object
, da nur oder ein anderer Wert object
halten kannDBNull
- Es gibt keinen wirklichen Unterschied zwischen "könnte ein Wert sein oder
DBNull
" vs "könnte ein Wert sein oder null
"
- Das Argument, dass es aus 1.1 (Pre-Nullable-Typen) stammt, ist bedeutungslos. wir könnten
null
in 1.1 perfekt gebrauchen
- Die meisten APIs haben "Ist es null?" Methoden zum Beispiel
DBDataReader.IsDBNull
oder DataRow.IsNull
- von denen keine tatsächlich DBNull
in Bezug auf die API existieren muss
DBNull
scheitert an der Nullverschmelzung; value ?? defaultValue
funktioniert nicht, wenn der Wert istDBNull
DBNull.Value
kann nicht in optionalen Parametern verwendet werden, da es keine Konstante ist
- Die Laufzeitsemantik von
DBNull
ist identisch mit der Semantik von null
; Insbesondere ist es DBNull
tatsächlich gleich DBNull
- es erledigt also nicht die Aufgabe, die SQL-Semantik darzustellen
- Oft wird erzwungen, dass Werte vom Werttyp eingerahmt werden, da sie zu häufig verwendet werden
object
- Wenn Sie testen müssen
DBNull
, können Sie genauso gut nur testennull
- Es verursacht große Probleme für Dinge wie Befehlsparameter, mit einem sehr dummen Verhalten, dass ein Parameter, wenn er einen
null
Wert hat, nicht gesendet wird ... nun, hier ist eine Idee: Wenn Sie keinen Parameter senden möchten - nicht Fügen Sie es der Parametersammlung hinzu
- Jedes ORM, an das ich denken kann, funktioniert einwandfrei, ohne dass es benötigt oder verwendet werden muss
DBNull
, außer als zusätzliches Ärgernis, wenn ich mit dem ADO.NET-Code spreche
Das einzige , auch nur annähernd überzeugendes Argument habe ich jemals gesehen das rechtfertigen Existenz eines solchen Wert ist in DataTable
, wenn in Werte vorbei eine neue Zeile zu erstellen; a null
bedeutet "Standard verwenden", a DBNull
ist explizit eine Null - offen gesagt hätte diese API eine spezielle Behandlung für diesen Fall haben können - ein imaginäres DataRow.DefaultValue
Beispiel wäre viel besser als die Einführung eines DBNull.Value
, das große Codebereiche ohne Grund infiziert.
Ebenso ist das ExecuteScalar
Szenario ... bestenfalls dürftig; Wenn Sie eine skalare Methode ausführen, erwarten Sie ein Ergebnis. In dem Szenario, in dem keine Zeilen vorhanden sind, null
scheint die Rückkehr nicht allzu schrecklich. Wenn Sie unbedingt zwischen "keine Zeilen" und "eine einzige zurückgegebene Null" unterscheiden müssen, gibt es die Reader-API.
Dieses Schiff ist schon lange gesegelt und es ist viel zu spät, um es zu reparieren. Aber! Bitte denken Sie nicht , dass alle zustimmen, dass dies eine "offensichtliche" Sache ist. Viele Entwickler sehen keinen Wert in dieser seltsamen Falte in der BCL.
Ich frage mich tatsächlich, ob all dies auf zwei Dinge zurückzuführen ist:
- das Wort
Nothing
anstelle von etwas verwenden zu müssen, das "null" in VB beinhaltet
- in der Lage zu sein, die
if(value is DBNull)
Syntax, die "genau wie SQL aussieht", und nicht die ach so kniffligeif(value==null)
Zusammenfassung:
Mit 3 Optionen ( null
, DBNull
oder ein Ist - Wert) ist nur dann sinnvoll , wenn es ein echtes Beispiel ist , wo Sie zwischen drei verschiedenen Fällen müssen eindeutig zu machen. Ich habe noch keine Gelegenheit gesehen, bei der ich zwei verschiedene "Null" -Zustände darstellen muss. Daher DBNull
ist dies völlig überflüssig, da es null
bereits existiert und eine viel bessere Sprach- und Laufzeitunterstützung bietet.