2010-04-13 10 views
30

J'ai été à plusieurs reprises posé les questions suivantes dans plusieurs interviews .... Mais encore ne peux pas les expliquer avec un exemple simple ...Quand doit-on utiliser les types NULL dans C#?

  1. Quels sont les types nullable dans C#?
  2. Quand doit-on utiliser des types NULL dans C#?
  3. Pouvez-vous donner un exemple simple?

Des suggestions?

+1

duplication possible de http://stackoverflow.com/questions/1550909/coding-practices-for-c-nullable-type – Ether

Répondre

30

De Using Nullable Types (C# Programming Guide)

Pour un exemple de lorsque vous pouvez utiliser un type Nullable, considérez comment une variable booléenne ordinaire peut avoir deux valeurs: vrai et faux. Il n'y a pas de valeur qui signifie "non défini". Dans de nombreuses applications de programmation, la plupart des interactions notamment base de données, variables peuvent exister dans un état indéfini . Par exemple, un champ dans une base de données peut contenir les valeurs true ou false, mais il peut également ne pas contenir de valeur . De même, les types de référence peuvent être définis sur null pour indiquer qu'ils ne sont pas initialisés.

+0

mais toutes les références (objet par exemple) peuvent être nulles. donc, au lieu de boxer un 'bool' dans' Nullable', pourquoi ne le placez pas dans 'Boolean' cela me fait encore me demander pourquoi .. –

17

Nul signifie «aucune valeur» ou «aucune donnée». Vous utilisez des types nullables lorsque "aucune valeur" est une valeur valide dans le contexte du système que vous désignez/utilisez.

int? weightOfCargo = TryGetTruckCargoWeight() 

Dans ce cas, le type nullable indique que TryGetTruckCargoWeight() peut retourner null. La signification de ceci serait géneralement que les données sont indisponibles (peut-être qu'il n'y a pas de camion, peut-être qu'il n'a pas été pesé, etc.).

9

Prenons l'exemple suivant:

Un outil a des paramètres spécifiés via l'interface utilisateur. Toutefois, l'outil peut également être exécuté à partir de la ligne de commande et les paramètres spécifiés dans l'interface utilisateur peuvent être remplacés via la ligne de commande. Ainsi, le code est le suivant:

bool? setting1; 

... commande Process ligne, si le réglage spécifié faire:

setting1.Value = setting; 

... plus tard

if(setting1.HasValue) 
    ui.setting1 = setting1.Value 
4

Chaque fois que vous utilisez des valeurs désignées pour représenter une valeur nulle:
* Une valeur minimale DateTime pour représenter une valeur de
* -1 pour représenter une valeur non définie pour r un entier
alors un type nullable serait un meilleur choix.

1
// to replace 
// if(foo.Id > 0) 
if(foo.Id.HasValue) 
{ 
    Update(foo); 
} 
else 
{ 
    Insert(foo); 
} 
4

Comme nous le savons tous, il y a deux types différents en C#

• Type refrence
• Type de valeur
type de référence peut être représenter en tant que valeur non existante (NULL) mais le type vaue, ne peut cependant pas représente la valeur NULL.
Pour exemple

Comme chaîne est le type de référence que vous pouvez le déclarer comme nul

String s=null; //ok

Mais si vous essayez de déclarer le type de valeur telle que Int32 null il produceses erreur du compilateur

Int32 i=null; // compiler error

Pour représenter null dans un type de valeur, vous devez utiliser une construction spéciale appelée type nullable. Il est représenté en utilisant? symbole.

Int32? I=null; //now its ok

scénario Maintenant, quand les types nullables commanly utilisés est dans la programmation de base de données où calss est la carte à la table avec des colonnes nullable.
• Si les colonnes sont de type Chaîne tel que (adresse email et adresse client), il n'y a pas de problème car vous pouvez le définir comme nul en C#
• Mais si les colonnes sont du type valeur double En tant que (solde du compte client), vous ne pouvez pas le mapper en C# sans utiliser de types valables.
Pour //
par exemple à une table des cartes client dans une base de données


public class Customer 
{ 
    ... 
    public decimal? AccountBalance; 
} 
+9

@Vijay: string est un type de référence. Pas un type de valeur – Jehof

+0

Petite correction: il y a en fait trois types différents. Qu'en est-il des types de pointeurs? :) http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx –

+0

@Jehof: merci d'avoir signalé une faute de frappe évidente –

2

C# a deux types de types de données. Type de valeur et types de référence. String est le type de référence et int est le type de valeur. Un type de référence peut être assigné avec une valeur nulle comme string s = null;. Mais vous ne pouvez pas affecter une valeur nulle directement à un entier. Comme int a = null // Donc, pour que le type de valeur accepte une valeur nulle, les types NULL sont utilisés. Pour le rendre annulable, un ? est ajouté à

? a = null;//ok. 
1

Je pense que si l'on parle de scénarios du monde réel lorsque votre table de base de données contient des colonnes nullable dans et vous devez créer DTO (objets de transfert de données) que la cartographie Db Entité . Dans de tels scénarios, vous devez obtenir exactement le même mappage de type de données dans vos classes Entity. Pour obtenir une telle exigence, les types nullables sont vraiment très utiles pour créer exactement le même mappage et permettre à l'utilisateur de travailler facilement dans ce senario.

Cordialement.

3

Un autre exemple:

imaginer, vous devez créer une méthode GetArticles dans votre BLL. Cette méthode doit prendre des arguments tels que la période de date (from et to arguments), la chaîne de recherche (search argument) et la catégorie de document (categoryId argument). Tous ces arguments sont facultatifs. Donc, dans un cas, vous voulez définir seulement argument from et search, dans d'autres seulement argument categoryId.

Pour cela, vous pouvez créer beaucoup de surcharges pour la méthode GetArticles avec la combinaison d'arguments nécessaire.L'autre façon est de définir la seule méthode GetArticles(DateTime? from, DateTime? to, string search, int? categoryId) pour cela. Dans ce cas, si l'argument est null, il sera ignoré.

De cause je connais une nouvelle fonctionnalité dans .NET 4.0 appelée optional parameters and named arguments mais avant cela c'était une bonne solution de contournement pour moi.