2016-11-24 3 views
0

J'ai un int nullable venant de la base de données d'une procédure stockée que je sais n'aura pas une valeur nulle. J'ai fait le beuglement:C# Meilleures pratiques - Quelle est la meilleure pratique lors de la conversion int? int

public List<EngineerDetails> GetCarouselEngineerDetailsList(int customerID) 
    { 
     using (var db = new MainEntities80()) 
     { 
      var foo0= db.procedure().Select(s => new fooo() 
      { 
       foo= s.foo, 
       foo2 = s.foo2, 
       foo3 = s.foo3 , 
       foo4 = s.foo4 , 
       x = s.CurrentJobId.Value 
      }).ToList(); 
      return foo0; 
     } 
    } 

Mais je voulais savoir, mais je sais que la valeur sera toujours là. Est-ce une bonne pratique de vérifier avant d'obtenir la valeur. Peut-être avec une expression tournante. Ou parce que nous savons que ce ne sera pas nul si nous oublions le chèque?

+6

Pourquoi est-ce un 'null' nullable du tout s'il ne peut jamais être nul? –

+0

@TimSchmelter: Je peux penser à un certain nombre de raisons pour lesquelles cela pourrait avoir du sens - par exemple, il ne peut pas être non nul pour * all * rows, mais si 's' est le résultat d'une requête, le non-null le contrôle peut déjà avoir été effectué là. –

+0

@Oliver: Votre code n'a pas de sens. Pourquoi utilisez-vous toujours un 'int?' Là au lieu d'assigner la valeur à une variable 'int'. Sinon, tout le code doit toujours savoir que c'est un nullable qui ne peut en réalité jamais être nul. –

Répondre

4

Un InvalidOperationException sera lancé si s.CurrentJobId est en fait null de toute façon. C'est presque toujours le meilleur résultat pour des situations où «le monde n'est pas comme je l'espérais». Il est donc logique d'utiliser le code exactement tel qu'il est.

-2

Vous pouvez utiliser CurrentJobID = s.CurrentJobID.GetValueOrDefault().

Si NULL est rencontrée alors cela produira la valeur par défaut du type sous-jacent, qui est pour les nombres toujours 0.

Ou si vous préférez avoir une valeur « exceptionnelle », comme -1, alors vous peut le faire avec CurrentJobID = s.CurrentJobID.GetValueOrDefault(-1).

+2

Cela va * se terminer * silencieusement avec une valeur de 0 quand le monde n'est pas comme le OP s'attend à ce qu'il soit. Le code continuera, écrasant probablement des données valides avec des données invalides. C'est comme si vous utilisiez 'as' à la place d'une distribution lorsque le reste du code a été écrit * en espérant * que la conversion soit valide. Embrasser les exceptions ici - il est dangereux de continuer comme si tout allait bien quand vous êtes en territoire inattendu. –

0
if (s.CurrentJobID.HasValue) 
{ 
    CurrentJobID = s.CurrentJobID.Value 
} 
0

Vous pouvez le faire comme ceci:

int result = s.CurrentJobId?? Int32.MinValue; 

Cela fera en sorte que la valeur de x est affectée au résultat, mais si s.CurrentJobId est nulle, Int32.MinValue sera affecté à il.

Cela empêchera qu'une exception soit levée, et vous pouvez vérifier par la suite si elle était nulle en cochant Int32.MinValue. Toutefois, si la valeur ne doit en aucun cas être nulle, il est préférable d'émettre une exception et d'échouer rapidement.