Frage

Ich bin ein wenig verwirrt über Nullwerte und Variablen in .NET. (VB bevorzugt)

Gibt es eine Möglichkeit, die „nullness“ einer bestimmten Variablen, unabhängig davon, ob es ein Objekt oder ein Werttyp? Oder hat meine NULL-Prüfung muss immer antizipieren, ob es einen Werttyp (z System.Integer) oder ein Objekt überprüft?

Ich denke, was ich suche eine Funktion, die alle möglichen Arten von null-ness prüft. Das heißt, jede Art von Variablen, die

a) wurden nie ein Wert zugewiesen, da erklärt

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

c) wurden auf einem anderen Variable Wert gleich null, das war

d) wurden auf einen ASP.NET-Sitzung / Anwendungsvariable, die nie eingestellt oder ausgelaufen wurden.

Gibt es eine allgemeine empfohlene Vorgehensweise, wenn es um die Handhabung null Szenarien in .NET kommt?

UPDATE: Wenn ich über einen Werttyp ist „null“ zu sprechen, was bedeuten, das ich wirklich ein Werttyp, wurde entweder nie zu einem bestimmten Zeitpunkt festgelegt oder von einem Null auf gleich oder gegossen Objekt.

War es hilfreich?

Lösung

Der Normalwert Typen (booleans, Ints, sehnt sich, float, double, ENUM und structs) sind keine Nullwerte enthalten.

Der Standardwert für alle Werttypen 0.

Die CLR wird nicht zulassen, Sie Variablen zugreifen, wenn sie eingestellt worden sind. Sie mögen denken, dies nicht immer der Fall ist, aber manchmal sind die CLR Schritte und initialisiert sie für Sie. Bei einem Verfahren Ebene müssen Sie alle Variablen explizit initialisieren, bevor sie verwendet werden.

Ferner kann, wie andere darauf hin, da .net 2.0 gibt es einen neuen generischen Typen namens Nullable<T>. Es gibt einige Compiler Kürzel in C # wie int? Nullable<int> bedeutet, verdoppeln? bedeutet Nullable<double> etc.

Sie können nur wickeln Nullable<T> über Nicht-Nullable-Wertetypen, die seit Referenzen bereits in Ordnung ist, die Fähigkeit haben null zu sein.

int? x = null;

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

In C # gibt es auch den Nullable-koaleszierenden Operator ?? wenn Sie eine nullable auf einen Nicht-Nullable-Wertetyp zuordnen. Aber wenn Sie nicht den Operator haben, können Sie rufen GetValueOrDefault ().

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

Andere Tipps

Werttypen können nicht null sein. Es verletzt, was es bedeutet, ein Wert Typ zu sein. Sie können Wertetypen als Nullable wickeln (Of T), die Ihnen eine große Menge von Methoden gibt, und prüft, ob nichts tun Arbeit. Aber Sie tun mit diesem Wrapper viel Aufwand haben. 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 ist auf einen Standardwert immer vorinitialisiert, 0 für Numerik, false für Boolesche Werte, etc

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 für diese Struktur wünschen würden. Das einzige Mal, dass ich für DBNull.Value überprüfen würde, wenn ich Werte bin verwenden, die aus einer Datenbank kam, und bevor ich sagte assign Wert von einer DATA Namespace-Klasse in eine andere Klasse [d dim b as string = Datareader (0)].

Normalerweise, wenn Sie sich Sorgen um ein Objekt zu haben instanziiert nicht, oder es braucht erneut instanziiert werden soll, dann nur ein IsNothing Scheck genügt.

In .Net, die nur zwei Arten von null sind, die ich bin mir dessen bewusst, null (nichts in VB) und DBNULL. Wenn Sie eine System.Nullable verwenden, können Sie die gleiche null verwenden Überprüfung Syntax, wie Sie mit einem Objekt würde. Wenn, wenn Ihr Nullable-Objekt ist eingerahmt das .Net 2.0 CLR intelligent genug ist, den richtigen Weg, um herauszufinden, diese zu behandeln.

Der einzige Fall, ich in beiden Arten ausgeführt habe, ist in der Datenebene einer Anwendung, wo es könnte direkt Datenbankdaten zugreifen. Zum Beispiel habe ich in einer Datatable in DBNULL laufen.

: 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
}

Typ Wertvariablen können nicht null enthalten, das ist, weil, was null bedeutet, bedeutet null, dass die Verweise Punkte nirgends. Ich weiß nicht, auf VB.net aber auf c # können Sie Werttypen wickeln sein nullables mit dem, wie „?“:

int? a = null;

Solange Sie mit Option Strict On entwickelst, (a) sollte kein Problem sein. Der Compiler wird dich schreien. Wenn Sie besorgt sind für Parameter zur Prüfung, nur verwenden

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

(b) Ihre Datenbank-Interaktion Schicht sollte damit umgehen. Wenn Sie mit LINQ, gibt es Möglichkeiten, dies zu umgehen. Wenn Sie mit typisierten Datensätzen gibt es eine .IsMyVariableNull Eigenschaft auf der Zeile, die automatisch generiert wird.

(c) Sie müssen sich keine Gedanken über Werttypen sorgen, sondern Referenztypen können mit einem einfachen geprüft werden ist nichts (oder IsNot Nothing).

(d), können Sie die gleiche Logik nach dem Lese gelten. Testen Sie den Empfang Variable gegen Nichts.

Für den größten Teil, eine einfache Überprüfung von Is Nothing werden Sie von bekommen. Ihre Datenbank-Interaktion Schicht helfen Ihnen, den klebrigen Fall von Nullwerten in Ihren Daten zu umgehen, aber es ist an Sie, sie entsprechend zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top