Verwechslung mit NULL in C #

7

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

    
DotnetDude 03.04.2009, 14:02
quelle

10 Antworten

27

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:

deklarieren %Vor%

oder

%Vor%

Beide sind identisch.

    
Adam Robinson 03.04.2009, 14:07
quelle
5
  • null ist nur für Referenz -Typen gültig: Typen, die ein class und nicht ein structure sind.
  • .Net hat auch Wertetypen: int, double, DateTime usw. Wertetypen können nicht null sein, also vergleichen Sie diese normalerweise mit ihrem Standardwert, der sehr oft 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.
  • Wenn Sie Generics verwenden, sehen Sie auch das verwendete 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.
Joel Coehoorn 03.04.2009 14:12
quelle
1

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.

    
Cerebrus 03.04.2009 14:09
quelle
1
  • null für Referenztypen in der Aktueller Nullwert
  • Nullable, hinzugefügt in .NET 2.0 ist ein Art, Nullen für Wert auszudrücken Typen, die per definitionem nicht sein können null.
  • Gleiches gilt für DateTime.MinValue - DateTime ist ein Werttyp und kann nicht sei null, also kannst du eine Konvention haben dass ein bekannter Wert, wie DateTime.MinValue wird so behandelt, als wäre es war null. Es hat auch andere Nutzungen.
Krzysztof Kozmic 03.04.2009 14:08
quelle
0

" 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.

    
Jesse C. Slicer 03.04.2009 14:07
quelle
0

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".

    
John Saunders 03.04.2009 14:08
quelle
0

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.

    
Peter Lillevold 03.04.2009 14:09
quelle
0

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.

    
Richard 03.04.2009 14:10
quelle
0

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

  • null kann nur für Referenztypen wie Sammlungen und benutzerdefinierte Klassen verwendet werden (String ist speziell)
  • DBNull ist für Nullwerte, die aus der DB-Abfrage stammen.
  • 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.

    
Chen Kinnrot 03.04.2009 14:11
quelle
0

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.

    
Rik 03.04.2009 14:14
quelle

Tags und Links