Ich bin immer verwirrt mit den verschiedenen Arten, Nullen auszudrücken. Es gibt den Nullreferenztyp (aka "null"). Dann habe ich gesehen, dass Entwickler während meiner gesamten Anwendung MinValue zur Darstellung von Nullen verwendet haben. Bsp: Double.MinValue oder DateTime.MinValue, außer für einen String, für den sie "null" verwenden
Dann gibt es System.DBNull (und System.DBNull.Value - nicht sicher, was zu verwenden ist). Um die Verwirrung zu verstärken, gibt es auch System.Nullable
und System.Nullable<T>
Namespaces.
Kann jemand mir helfen, diese Null Verwirrung zu beseitigen?
Danke
Sicher.
System.DBNull
ist eine Klasse, die von ADO.NET verwendet wurde (und immer noch ist), um einen null
-Wert in einer Datenbank darzustellen.
null
ist eigentlich eine null
Referenz, und in Ihrem Anwendungscode sollte jeder Referenztyp null
als dessen, na ja, null
-Wert verwenden.
Die Verwendung von MinValue
für verschiedene primitive Typen (die, da sie Werttypen sind, kann nicht null
zugewiesen werden) stammt aus den dunklen Tagen vor C # 2.0, die Generics einführten. Die bevorzugte Methode zum Darstellen eines Nullwert-Primitivtyps besteht nun darin, den generischen Typ Nullable<T>
zu verwenden, der normalerweise in Kurzform mit einem Fragezeichen nach dem Primitivtyp dargestellt wird. Zum Beispiel könnte ich eine nullable int
Variable namens foo
in C # als:
oder
%Vor%Beide sind identisch.
null
ist nur für Referenz -Typen gültig: Typen, die ein class
und nicht ein structure
sind. type.MinValue
ist, aber etwas (boolescher Wert) , beispielsweise). Nullable<T>
ist für einen Werttyp, der wirklich null sein kann. Der Standardwert (möglicherweise MinValue) ist ebenfalls gültig und Sie müssen ihn unterscheiden, wenn die Variable noch nicht zugewiesen wurde. In C # können Sie ein? mit einem Werttyp als Short-Hand-Notation (Beispiel: int?
), aber Sie erstellen immer noch das gleiche Nullable<T>
. DBNull
bezieht sich speziell auf NULL-Werte aus einer Datenbank. Es ist nicht das Gleiche wie Null an anderer Stelle in der Sprache: Es dient nur dazu, mit einer Datenbank zu sprechen, damit Sie wissen können, wann eine Abfrage einen Nullwert zurückgegeben hat. default(T)
-Konstrukt, wobei T ein Typparameter ist. Dadurch können Sie den Standardwert eines Typs festlegen, ohne zu wissen, ob dieser Typ ein Referenztyp oder ein Werttyp ist, und noch viel weniger der Standardwert eines bestimmten Werttyps. Ein Null
-Wert repräsentiert ein Objekt vom Referenztyp, dessen Speicher noch nicht belegt ist.
Das MinValue
stellt kein Null
dar, sondern ist eine Eigenschaft, die oft verwendet wird, um den kleinsten möglichen konstanten Wert darzustellen, den ein gegebener Werttyp haben kann.
Die Klasse DBNull.Value
ist eine Zuordnung der NULL-Werte, die zurückgegeben / an eine Datenbank übergeben wurden.
Der generische Typ Nullable ermöglicht die Zuweisung von Nullwerten zu einem Werttyp.
" MinValue
" s wurden mit Werttypen verwendet, bevor NULL-Typen in C # 2.0 zur Verfügung standen. Es gibt also eine Menge Legacy-Code, der den alten Stil des Wissens verwendet, wenn ein Werttyp keinen Wert hat. Heutzutage ist es viel einfacher, ein DateTime? date = null
als DateTime date = DateTime.MinValue
zu verwenden. So weit wie DBNull geht, ist das etwas, das als Abstraktionsschicht für Datenbanken benötigt wird, aber Sie können vermeiden, dass Sie sich selbst damit beschäftigen müssen, indem Sie ein ORM wie NHibernate oder ähnliches - Sie ziemlich, von einer App verwenden. Entwicklungsstandpunkt muss nur mit eingebauten C # -Typen umgehen.
MinValue ist nicht null. Es ist MinValue. Es wird manchmal von Benutzern, die C # 1.0 verwenden, verwendet, die keine Nullwerttypen hatten. Stattdessen sollten sie Nullable, oder DateTime? Verwenden.
DBNull ist ein .NET-Wert, der für die Kommunikation mit einer Datenbank verwendet wird ("DB" null). Das Datenbankkonzept von NULL bedeutet etwas anderes als die .NET-Nullreferenz. In der Datenbank bedeutet NULL "unbekannt" oder "abwesend".
Referenztypen (auch bekannt als Objekte) können auf Null gesetzt werden, da Referenztypvariablen nur ein Zeiger auf die tatsächliche Instanz sind. Das Fehlen einer Instanz anzuzeigen, ist einfach, da Sie die Variable direkt auf null setzen können.
Bei Werttypen ist dies etwas schwieriger, da eine Werttypvariable immer einen Wert enthält. Daher war die Verwendung von Double.MinValue oder DateTime.MinValue in den Tagen vor der Nullzeit einigermaßen gültig. Damals gab es keine einfache Möglichkeit, das Fehlen eines Werts in Werttypen auszudrücken.
Nun können Sie mit nullfähigen Typen sagen:
%Vor%Und so können Sie auch value type Variablen haben, die null enthalten.
System.DBNull ist eine andere Geschichte, da es direkt an den Ausdruck "NULL" in Datensätzen gebunden ist. Dies wurde vor NULL-fähigen Typen eingeführt, die DBNull ersetzen.
Die meisten .NET-Typen sind reference -Typen, und null
ist "keine Referenz", die einer Variablen oder einem Feld zugewiesen werden kann, um anzuzeigen, dass kein Objekt vorhanden ist.
Alle anderen .NET-Typen sind Werttypen. Es gibt immer einen Wert mit einem Werttyp, also keine Möglichkeit, "keinen Wert" anzugeben. Daher kann eine Implementierung spezielle spezielle Werte definieren, um dies anzuzeigen. Oft wird dafür das Feld MinValue
(Konstante) des Werttyps verwendet. Wenn Sie DateTime.MinValue
für ein Geburtsdatum verwenden, kann dies auf "nicht bekannt" oder "nicht anwendbar" hinweisen (z. B. für eine juristische Person).
DbNUll
existiert, um die Bedeutung von NULL
von RDBMS auszudrücken, die sich etwas von .NET unterscheidet. In den meisten Fällen wird dies in null oder ähnlich übersetzt.
Schließlich ist Nullable<T>
ein Wrapper für Werttypen, um "nicht bekannt" direkter auszudrücken, und ist im Allgemeinen eine bessere Option als MinValue
, wurde aber in .NET 2 hinzugefügt, so dass ältere Designs möglicherweise bereits verwendet haben MinValue
vor Nullable<T>
ist verfügbar.
Der beste Weg, um diese verschiedenen Null-Werte zu verstehen, ist es, sie zu versuchen und zu sehen, was die Verwendung von jedem, aber um die Dinge hier einfach zu machen ist ein Leitfaden
weil wir einer Dezimalzahl oder einer doppelten Zahl keine Null zuweisen können, weisen wir sie mit der MinValue-Eigenschaft zu (sie sind Wertobjekte)
Nullable ist eine Möglichkeit für den Entwickler, Wertobjekten wie dezimal,
Nullable<int> is same as int?
Ich hoffe, ich habe dir geholfen, die Unterschiede zu verstehen.
Der wichtige Unterschied ist hier zwischen Werttypen und Referenztypen. Werttypen repräsentieren direkt einen bestimmten Wert, während Referenztypen auf einen Speicherort zeigen, der einen Wert darstellen sollte. Wenn ein Referenztyp tatsächlich nicht auf einen Speicherort mit gültigem Inhalt zeigt, ist der Verweis Null.
Da Werttypen direkte Werte darstellen, dürfen sie nicht null sein. Es kann jedoch vorkommen, dass ein tatsächlicher Wert eines Werttyps unbekannt ist. Für diesen Fall stellt .Net das Nullable-Typenkonstrukt bereit. Wenn ein solches Konstrukt jedoch nicht verfügbar ist, neigen Benutzer dazu, spezielle oder Standardwerte wie MinValue zu verwenden.
Bei der Kommunikation mit Datenbanken können viele Dinge, von denen wir erwarten, dass sie Werttypen sind, tatsächlich Null sein, da dies die Art ist, wie die Datenbank mit unbekannten Werten umgeht. Dies kann auch durch die Nullable-Typen gelöst werden, aber diese waren nicht immer verfügbar. Deshalb existiert DBNull, um mit einer möglichen Null in einer Datenbank umzugehen.