2010-09-26 5 views
1

Est-il correct de construire mes entités objet avec ce type?Types nullables en tant que propriété

public class Patient 
    { 
     public Datetime? AdmissionDate { get; set; } 
     public double? AdmissionFee { get; set } 
     public int? RoomNumber { get; set } 
    } 

est l'inconvénient WHat si je mis en œuvre ce dans toutes mes entités, parce que récemment, je rencontre toujours la situation où je vraiment besoin de définir la valeur null, spécialement dans DateTime. Ma solution actuelle a été mise à DateTime.MinValue lors de l'extraction de l'enregistrement de datetime de la base de données, et lorsque Im affiche le résultat dans Ui, je le vérifie comme ceci.

if (patient.AdmissionDate == Datetime.MinValue) 
    { 
     DisplayAdmissionDate(string.empty) 
    } 
    else 
    { 
     DisplayAdmissionDate(patient.AdmissionDate) 
    } 

Oui, dans gridview, je dois le mettre sur l'événement Databound, donc quand j'ai millions de données pour afficher, je pensais vérifier chaque de chaque boucle n'a pas été la façon la plus élégante du datetime donc, à ce problème, je trouve ça? tapez où je peux mettre des valeurs nulles, et je prévois d'éditer toutes mes propriétés, donc à l'avenir, mettre des valeurs nulles à ces types de valeur ne sera pas un problème. Tout conseiller les gars? TIA

+0

"quand j'ai un million de données à afficher" - il n'y a généralement aucune bonne raison d'afficher plus d'une centaine d'enregistrements pour un utilisateur à la fois. – StingyJack

Répondre

1

L'objet doit toujours contenir au moins un ValueType non nullable en tant que clé primaire. Dans votre cas, vous devez utiliser

public int ID {get;set;} 

Cela étant, vous pouvez toujours identifier un objet. Le reste des propriétés peut être nullable.

La vérification de nullable est parfaitement bien, à moins que le GridView puisse déjà détecter cela seul. Les types nullables ont été introduits exactement dans ce but, permettant à un ValueType d'avoir null comme valeur. L'aspect performance doit être minimal n'est en aucun cas complexe et l'optimisation serait un cas d'optimisation prématurée.

Si vous voulez en savoir plus sur la mise en œuvre de Nullable<T>, un coup d'oeil here (malheureusement, la page originale est actuellement vers le bas, de sorte que la version webcache doit être suffisante. Le code est lisible bien, juste le blogpost est abit cassé).

+0

absolument c'est bien, mais mon point est, y at-il un inconvénient en utilisant les types Nullable? en performance ou en design? – CSharpNoob

+0

Il n'y a aucun inconvénient dans votre cas. – gandjustas

0

L'inconvénient avec les types nullable est que vous devez toujours vérifier pour voir wether ils ont une valeur ou non avant de faire fonctionner sur eux ...

if(AdmissionFee.HasValue) total += AdmissionFee; 

au lieu de simplement

total += AdmissionFee; 
+0

merci, mais ce n'est pas beaucoup de tracas si .. total + = AdmissionFee ?? 0 ^^ – CSharpNoob

+2

Pas tellement sur le tracas de taper quelques caractères supplémentaires, mais plus sur la lisibilité. Et, si vous savez qu'une valeur ne sera jamais nulle, ne la rendez pas nulle ... –

0

Vous pouvez J'ai des problèmes avec la liaison de données, je ne pense pas que WinForms va bien gérer car il est antérieur aux types Nullable.

Si un élément peut être nul dans la vie réelle, alors un type Nullable est une bonne solution car il rend l'effacement. Cependant, ne les utilisez pas simplement pour le plaisir.

3

Ceci est une de ces situations où aucune réponse dogmatique unique ne couvre tous les cas.

Vous ne pouvez pas vous en sortir en utilisant toujours des types nullables (ou en les évitant toujours). Vous devriez penser à chaque cas et utiliser celui dont vous avez réellement besoin.

Vous avez mentionné que vous aviez souvent besoin d'une valeur nulle DateTime. Alors, pourquoi ne pas utiliser un DateTime?dans les cas? Cela devrait être une considération indépendante de tous les autres domaines, en particulier int s.

La valeur null dans les types NULL signifie que la valeur est quelque chose comme non spécifié, indisponible ou inconnu. Il existe de nombreuses situations où ce concept existe (par exemple, les utilisateurs d'un site Web peuvent ou non spécifier leur date de naissance, ce qui devrait être un DateTime?), mais il existe également de nombreuses situations où ce concept n'a aucun sens (par ex. dans une liste - si la liste elle-même n'est pas nulle, alors il y a clairement un nombre défini d'éléments, alors cela devrait être int, et non int?).

Questions connexes