2008-10-02 12 views
6

Ich bin ein wenig verwirrt über Null-Werte und Variablen in .NET. (VB bevorzugt).NET DBNull vs Nothing über alle Variablentypen?

Gibt es eine Möglichkeit, die "Nullheit" von einer beliebigen Variablen zu überprüfen, unabhängig davon, ob es ein Objekt oder ein Werttyp war? Oder muss mein Null-Check immer voraussehen, ob es einen Werttyp (z. B. System.Integer) oder ein Objekt überprüft?

Ich denke, was ich suche ist eine Funktion, die alle möglichen Arten von Null-Nichtigkeit überprüft. Das heißt, jede Art von Variablen, die

a) wurden nie da erklärt

b ein Wert zugewiesen) wurden einen Nullwert von einem Datenobjekt zugeordnet (die aus einer Datenbank kam)

c) wurden set ist gleich einem anderen Variablenwert, der null war

d) wurden auf eine ASP.NET-Sitzung/Anwendungsvariable gesetzt, die nie gesetzt oder abgelaufen war.

Gibt es eine allgemeine Best Practice, wenn es darum geht, Null-Szenarien in .NET zu behandeln?

UPDATE: Wenn ich über einen Werttyp bin, der "null" ist, meine ich eigentlich einen Werttyp, der entweder nie gesetzt wurde oder zu irgendeinem Zeitpunkt gleich einem Nullobjekt gesetzt wurde.

Antwort

2

Normalwerttypen (boolean, ints, longs, float, double, enum und structs) sind nicht nullbar.

Der Standardwert für alle Werttypen 0.

Die CLR werden Sie nicht Variablen zugreifen können, wenn sie nicht gesetzt worden sind. Sie denken vielleicht, dass dies nicht immer der Fall ist, aber manchmal tritt die CLR ein und initialisiert sie für Sie. Auf Methodenebene müssen Sie alle Variablen explizit initialisieren, bevor sie verwendet werden.

Weiter, wie andere darauf hinweisen, gibt es seit .net 2.0 einen neuen generischen Typ namens Nullable<T>. Es gibt einige Compiler-Kürzel in C# wie Int? bedeutet Nullable<int>, doppelt? bedeutet Nullable<double> usw.

Sie können nur Nullable<T> über nicht-nullable Werttypen umbrechen, was in Ordnung ist, da Referenzen bereits die Fähigkeit haben, null zu sein.

int? x = null; 

Für einen int ?, während Sie gegen null testen, ist es manchmal schöner x.HasValue() zu nennen.

In C# gibt es auch die nullable coalescing operator ?? Wenn Sie einem nichtwertbaren Werttyp ein Nullwert zuweisen möchten. Aber wenn Sie den Operator nicht haben, können Sie GetValueOrDefault() aufrufen.

int y = x ?? 2; // y becomes 2 if x is null. 
int z = x.GetValueOrDefault(2); // same as y 
4

Werttypen dürfen nicht null sein. Es verletzt, was es bedeutet, ein Werttyp zu sein. Sie können Werttypen als Nullable (Of T) umschließen, was Ihnen eine große Menge an Methoden bietet und die Prüfung auf Nichts funktioniert. Aber Sie haben viel Overhead mit diesem Wrapper. Vielleicht können Sie klären, was Sie zu tun versuchen?

die VB-Syntax für Nullable-Wrapper für Vollständigkeit ist:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0' 
Dim j as Integer? = Nothing '.NET 3.5' 

EDIT: Wert Typ sind auf einen Standardwert immer vorinitialisiert, 0 für Numerik, false für Booleans usw.

+0

die Regel ist, dass für alle Werttypen, die Standardeinstellung ist 0. (int, long, float, double, Aufzählungen, Strukturen, etc.) –

0

Typ Wert Variablen kann nicht null enthalten, weil null bedeutet, null bedeutet, dass die Referenzen nirgends zeigen. Ich weiß nicht, auf VB.net aber auf C# können Sie Werttypen wickeln nullables mit der sein, wie „?“:

int? a = null; 
+0

int? ist nur eine C# -Compiler-Kurzschrift für Nullable . –

2

Ist das, was Sie nach?

if IsNothing(foo) OrElse IsDbNull(foo) Then 
    ' Do Something Because foo Is Either Nothing or DBNull.Value 
End If 

In Wahrheit bin ich nicht sicher, warum Sie diese Struktur wünschen würden. Die einzige Zeit, die ich nach DBNULL.Value suchen würde, ist, wenn ich Werte verwende, die von einer Datenbank stammen, und bevor ich den Wert einer DATA-Namespace-Klasse einer anderen Klasse [d. H. Dim b als Zeichenfolge = DataReader (0)].

Normalerweise, wenn Sie ein Objekt sind besorgt haben nicht instanziiert worden ist, oder müssen sie erneut instanziiert werden soll, dann nur ein IsNothing Scheck genügt.

1

In .Net, das sind nur zwei Arten von Null, die ich kenne, Null (nichts in VB) und DbNull. Wenn Sie eine System.Nullable verwenden, können Sie dieselbe Syntax für die Nullpunktprüfung verwenden wie für ein Objekt. Wenn das NULL-fähige Objekt eingerahmt ist, ist die .Net 2.0 CLR intelligent genug, um den richtigen Weg zu finden.

Der einzige Fall, in dem ich beide Typen gefunden habe, ist in der Datenebene einer Anwendung, wo ich direkt auf Datenbankdaten zugreifen kann. Zum Beispiel habe ich in einer DataTable auf DbNull gestoßen. Um zu überprüfen, für beide null Typen in diesem situration, könnten Sie eine Erweiterungsmethode wie (sorry, in C#) schreiben:

static public bool IsNull(this object obj) 
{ 
    return obj != null && obj != DbNull.Value; 
} 

... 

if(dataTable[0]["MyColumn"].IsNull()) 
{ 
    //do something 
} 
0

Solange Sie entwickeln mit Option Strict On, (a) shouldn‘ t ein Problem sein. Der Compiler wird dich anschreien. Wenn Sie Bedenken haben, nach Parametern zu suchen, verwenden Sie einfach

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer) 
    if param1 is nothing then 
     Throw New ArgumentException("param1 cannot be null!") 
    end if 
    'param2 cannot be null 
End Sub 

Für (b) sollte Ihre Datenbank-Interaktionsschicht damit umgehen. Wenn Sie LINQ verwenden, gibt es Möglichkeiten, damit umzugehen. Wenn Sie typisierte Datasets verwenden, wird die Eigenschaft .IsMyVariableNull in der Zeile angezeigt, die automatisch generiert wird.

Für (c) müssen Sie sich nicht um Werttypen kümmern, aber Referenztypen können mit einem einfachen Is Nothing (oder IsNot Nothing) überprüft werden.

Für (d) können Sie die gleiche Logik nach dem Lesen anwenden. Testen Sie die empfangende Variable gegen nichts.

In den meisten Fällen erhalten Sie eine einfache Überprüfung von Is Nothing. Ihre Datenbankinteraktionsschicht hilft Ihnen dabei, den klebrigeren Fall von Nullwerten in Ihren Daten zu handhaben, aber es liegt an Ihnen, sie entsprechend zu behandeln.