2008-10-02 5 views
6

Je suis un peu confus au sujet des valeurs nulles et des variables dans .NET. (VB préféré).NET DBNull vs Rien dans tous les types de variables?

Y at-il un moyen de vérifier la "nullité" de n'importe quelle variable donnée, qu'il s'agisse d'un objet ou d'un type de valeur? Ou mon contrôle nul doit-il toujours anticiper s'il vérifie un type de valeur (par exemple System.Integer) ou un objet?

Je suppose que ce que je cherche est une fonction qui vérifie tout type de nullité possible. Autrement dit, tout type de variables qui

a) n'ont jamais attribué une valeur depuis déclarée

b) ont été affectées d'une valeur nulle à partir d'un objet de données (qui est venu d'une base de données)

c) ont été set égal à une autre valeur de variable qui était nulle

d) ont été définies sur une variable de session/application ASP.NET qui n'a jamais été définie ou expirée.

Existe-t-il une meilleure pratique générale en matière de gestion des scénarios NULL dans .NET? Quand je parle d'un type de valeur étant "null", ce que je veux dire vraiment est un type de valeur qui n'a jamais été défini ou a été défini à un certain point ou cast à partir d'un objet nul.

Répondre

2

Les types de valeur normale (booléens, entiers, longs, flottants, doubles, enum et structs) ne peuvent pas être annulés.

La valeur par défaut pour tous les types de valeur est 0.

Le CLR ne vous laissera pas d'accéder aux variables à moins qu'elles ont été définies. Vous pouvez penser que ce n'est pas toujours le cas, mais parfois le CLR intervient et les initialise pour vous. Au niveau de la méthode, vous devez initialiser explicitement toutes les variables avant de les utiliser.

En outre, comme d'autres le font remarquer, depuis .net 2.0, il existe un nouveau type générique appelé Nullable<T>. Il y a des raccourcis de compilateur dans C# comme int? signifie Nullable<int>, double? signifie Nullable<double> etc.

Vous pouvez uniquement mettre en surbrillance Nullable<T> sur des types de valeur non nullable, ce qui est correct puisque les références ont déjà la possibilité d'être nulles.

int? x = null; 

Pour un entier ?, alors que vous pouvez tester contre zéro, il est parfois plus agréable d'appeler x.HasValue().

En C# il y a aussi le nullable coalescing operator ?? lorsque vous souhaitez affecter une valeur nullable à un type de valeur non nullable. Mais si vous n'avez pas l'opérateur, vous pouvez appeler GetValueOrDefault().

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

Les types de valeur ne peuvent pas être null. Cela viole ce que signifie être un type de valeur. Vous pouvez envelopper les types de valeur comme Nullable (Of T) qui vous donne un grand ensemble de méthodes, et vérifie que Nothing ne fonctionne pas. Mais vous avez beaucoup de frais généraux avec cet emballage. Peut-être pouvez-vous clarifier ce que vous essayez de faire?

Pour être complet la syntaxe VB pour emballages nullables est:

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

EDIT: Type de valeur sont toujours préinitialisés à une valeur par défaut, 0 pour les valeurs numériques, faux pour booléens, etc.

+0

la règle est que pour tous les types de valeur, la valeur par défaut est 0. (int, long, float, double, énumérations, struct, etc.) –

0

variables de type valeur ne peut pas contenir de null, c'est parce que null signifie, null signifie que les références ne pointent nulle part. Je ne sais pas VB.net mais C#, vous pouvez envelopper les types de valeur à l'aide de l'nullables, comme « ? »:

int? a = null; 
+0

int? est juste un raccourci du compilateur C# pour Nullable . –

2

Est-ce que vous êtes après?

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

En vérité, je ne sais pas pourquoi vous souhaiteriez cette structure. Le seul moment où je vérifierais DBNULL.Value est quand j'utilise des valeurs provenant d'une base de données, et avant que j'attribue cette valeur d'une classe d'espace de noms DATA à une autre classe [c.-à-d. dim b comme chaîne = dataReader (0)].

Généralement, si vous êtes préoccupé par le fait qu'un objet n'a pas été instancié ou qu'il a besoin d'être ré-instancié, alors une vérification IsNothing suffira.

1

Dans .Net, je ne connais que deux types de null, null (rien dans VB) et DbNull. Si vous utilisez System.Nullable, vous pouvez utiliser la même syntaxe de vérification des valeurs nulles que pour un objet. Si votre objet nullable est encadré, le .NET 2.0 CLR est assez intelligent pour trouver la bonne façon de gérer cela.

Le seul cas que j'ai rencontré dans les deux types est dans le niveau de données d'une application où j'accède peut-être directement aux données de base de données. Par exemple, j'ai couru dans DbNull dans un DataTable. Pour vérifier ces deux types nuls dans cette situration, vous pourriez écrire une méthode d'extension comme (désolé, en C#):

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

... 

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

Tant que vous développez avec Option Strict On, (a) shouldn » t être un problème. Le compilateur vous criera dessus. Si vous avez peur de vérifier les paramètres, utilisez simplement

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 

Pour (b), votre couche d'interaction de base de données devrait gérer cela. Si vous utilisez LINQ, il existe des moyens de gérer cela. Si vous utilisez des ensembles de données typés, il existe une propriété .IsMyVariableNull sur la ligne générée automatiquement. Pour (c), vous n'avez pas besoin de vous soucier des types de valeurs, mais les types de référence peuvent être vérifiés avec un simple Is Nothing (ou IsNot Nothing).

Pour (d), vous pouvez appliquer la même logique après la lecture. Testez la variable de réception contre Nothing.

Pour la plupart, une simple vérification de Is Nothing vous permettra de vous en sortir. Votre couche d'interaction de base de données vous aidera à gérer le cas des valeurs nulles dans vos données, mais c'est à vous de les gérer de manière appropriée.

Questions connexes