2011-12-20 11 views
0

奇妙な問題があります。何年にもわたって数回起こったのですが、私は決してその理由を理解できませんでした。私が使っていたコードを並べ替えることで常に解決しましたが、それを扱うより適切な方法があるか、少なくとも後ろに何があるかを考えていることを知りたいと思います。ヌルチェックは、null以外の値の場合はtrueを返します。

非作業バージョン:

public bool CaptureFrame(ArrayCache cache) 
{ 
    if (cache == null) 
     throw new ArgumentNullException("cache"); 

    DataArray frame = cache.CacheData; 

    if (frame == null) 
     throw new ArgumentNullException("cache.CacheData"); 


    // do stuff 
} 

作業バージョン:

public bool CaptureFrame(ArrayCache cache) 
{ 
    if (cache == null) 
     throw new ArgumentNullException("cache"); 

    if (cache.CacheData == null) 
     throw new ArgumentNullException("cache.CacheData"); 

    DataArray frame = cache.CacheData; 


    // do stuff 
} 

問題はこれです:フレームはないヌル(少なくともデバッガによるとされ、かつ任意の測定Iでコードをトレースすることができます)。ただし、if (frame == null)チェックを実行すると、例外がスローされます。私はcache.CacheDataをチェックするために書き直しましたが、うまくいきますが、実際にはコードロジックに何の違いもないはずです。

私はこのサイトでもう1つの質問を見つけることができました。これは、同様の問題を伴い、==と!=演算子に過負荷がかかっていました。これらの演算子は、自分のコードで問題のクラスのためにオーバーロードされていません。また、それは独立したクラスなので、継承するものはありません。

編集:ジョン・サンダースはCacheDataプロパティのコードを要求:あなたが DataArrayフレーム= cache.CacheDataを呼び出す非作業1で例外をマッピングしているよう

private DataArray cacheData; 

public DataArray CacheData 
{ 
    get 
    { 
     return cacheData; 
    } 
    set 
    { 
     cacheData = value; 
    } 
} 
+2

'DataArray'とは何ですか?万が一の価値観ですか? – Oded

+1

'CacheData'のタイプは何ですか? – Cameron

+3

これらのブロックは同じではありません。最初に 'DataArray frame = cache.CacheData'、2番目に' DataArray frame = cache.Frame'があります。また、 '=='演算子のオーバーロードに加え、['implicit'](http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx)型のキャストもチェックします。 – Kobi

答えて

0

が見えます。 しかし、もしcache.CacheDataがnullの場合は、DataFrameに割り当てているのですが、それは常に私の意見ではnullを最初に代入したり、2番目のものが正常に見えると仮定するのがベストです。例外をトラップし、両方のシナリオでいくつかのテストケースを試すことができます

関連する問題