2016-11-24 7 views
0

私はnull値を持たないことがわかっているストアドプロシージャからデータベースから入ってくるnull可能なintを持っています。私は怒鳴る行っている:C#ベストプラクティス - intを変換するときのベストプラクティスは何ですか? to 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; 
     } 
    } 

をしかし、私は、私は値が常にあるだろうことを知っているが、知りたいと思いました。値を取得する前に確認することをお勧めしますか?たぶん、扇動的な表現で。 または、私たちは小切手について忘れてしまった場合、それがnullでないことを知っているので、

+6

ヌルになることができない場合は、なぜそれがヌル可能な 'int'ですか? –

+0

@TimSchmelter:私はそれが理にかなっている理由のいくつかを考えることができます - たとえば、* all *行ではnullでないかもしれませんが、 's'がクエリの結果であれば、すでにチェックが行われている可能性があります。 –

+0

@Oliver:あなたのコードは意味をなさない。値を 'int'変数に代入するのではなく、なぜ' int 'を使っているのですか?さもなければ、すべてのコードは、それが実際にはnullにはならないnull可能であることをまだ知っていなければなりません。 –

答えて

4

s.CurrentJobIdが実際にnullの場合、InvalidOperationExceptionがスローされます。これは、「世界は私が期待している方法ではない」という状況のために、ほとんど常に最良の結果です。コードをそのままそのまま使用することは理にかなっています。

-2

CurrentJobID = s.CurrentJobID.GetValueOrDefault()を使用できます。

NULLが、これは数字のために常に0

であるか、基になる型のデフォルト値が生成されます発生した場合には、むしろ「例外」値-1など、あなたを持っているだろう場合CurrentJobID = s.CurrentJobID.GetValueOrDefault(-1)でこれを行うことができます。

+2

これは、OPが期待しているように、世界がそうでないときに0の値で*静かに*終わるでしょう。コードは無効なデータで有効なデータを上書きする可能性があります。これは、残りのコードが変換が有効であると期待されている*ときに、キャストの代わりに 'as'を使うようなものです。ここに例外を受け入れる - 実際にあなたが予期しない領域にいるときにすべてがうまくいくかのように続行することは危険です。 –

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

あなたはこのようにそれを行うことができます:これは、xの値が生じるように割り当てられていることを確認しますが、s.CurrentJobIdがnullの場合、Int32.MinValueが割り当てられます

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

それ。

例外がスローされるのを防ぎ、後でInt32.MinValueをチェックして、それがnullだった場合は後で検証できます。

ただし、値が実際にはnullにならない場合は、例外がスローされて高速に処理されるためのより良いオプションです。

関連する問題