Question

Je suis un peu confus au sujet des valeurs nulles et des variables dans .NET. (VB préféré)

Existe-t-il un moyen de vérifier la " nullness " de N'IMPORTE QUELLE variable donnée, que ce soit un objet ou un type de valeur? Ou bien ma vérification null doit-elle toujours prévoir si elle vérifie un type de valeur (par exemple, System.Integer) ou un objet?

Je suppose que ce que je recherche, c’est une fonction qui vérifie tous les types de nullité possibles. C’est-à-dire tout type de variable qui

a) n'a jamais reçu de valeur depuis sa déclaration

b) ont reçu une valeur null à partir d'un objet de données (provenant d'une base de données)

c) ont été mis égaux à une autre valeur de variable qui était nulle

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

Existe-t-il une meilleure pratique générale en matière de gestion des scénarios nuls dans .NET?

UPDATE: lorsque je parle d'un type de valeur étant & "null &"; ce que je veux vraiment dire est un type de valeur qui n'a jamais été défini ou a été défini à un moment donné. est égal à ou converti à partir d'un objet null.

Était-ce utile?

La solution

Les types de valeurs normales (booleans, ints, longs, float, double, enum et structs) ne sont pas nullables.

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

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

De plus, 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 en C # comme int? signifie Nullable<int>, double? signifie Nullable<double> etc.

Vous ne pouvez encapsuler x.HasValue() que sur des types de valeur non nullables, ce qui est bien, car les références ont déjà la possibilité d'être nulles.

int? x = null;

Pour un int ?, bien que vous puissiez tester contre null, il est parfois plus agréable d'appeler <=>.

En C #, il existe également un opérateur de coalescence nullable ? 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

Autres conseils

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

Pour être complet, la syntaxe VB des wrappers Nullable est la suivante:

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

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

Est-ce ce que vous recherchez?

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

En vérité, je ne suis pas sûr de savoir pourquoi vous souhaiteriez cette structure. La seule fois que je vérifie la valeur DBNULL.Value, c’est lorsque j’utilise des valeurs provenant d’une base de données et avant d’affecter ladite valeur d’une classe DATA Namespace à une autre classe [i.e. dim b comme chaîne = dataReader (0)].

En règle générale, si un objet n'a pas été instancié ou si vous avez besoin de le faire pour être ré-instancié, un simple contrôle IsNothing suffit.

En .Net, il n’ya que deux types de null à ma connaissance, null (rien dans VB) et DbNull. Si vous utilisez System.Nullable, vous pouvez utiliser la même syntaxe de contrôle de nullité que vous le feriez avec un objet. Si votre objet nullable est encadré, le .Net 2.0 CLR est suffisamment intelligent pour trouver le bon moyen de gérer cela.

Le seul cas que j'ai rencontré dans les deux types concerne le niveau de données d'une application où je pourrais accéder directement aux données de base de données. Par exemple, j'ai rencontré DbNull dans un DataTable. Pour vérifier ces deux types nuls dans cette situation, vous pouvez écrire une méthode d’extension du type (désolé, en C #):

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

...

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

Les variables de type valeur ne peuvent pas contenir null, c'est parce que ce que signifie null, null signifie que les références ne pointent nulle part. Je ne sais pas sur VB.net mais sur c #, vous pouvez envelopper les types de valeur pour qu'ils puissent être nullables à l'aide de & "; &", Comme:

int? a = null;

Aussi longtemps que vous développez avec Option Strict On, (a) ne devrait pas être un problème. Le compilateur va crier à vous. Si vous souhaitez 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 à vous soucier des types de valeur, mais les types de référence peuvent être vérifiés avec une simple valeur est rien (ou n'est rien).

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

Pour l’essentiel, une simple vérification d’Is Nothing vous réussira. Votre couche d’interaction de base de données vous aidera à gérer le cas plus complexe des valeurs nulles dans vos données, mais il vous appartient de les gérer correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top