对于非空值,空检查返回true

时间:2011-12-20 20:22:50

标签: c#

有一个奇怪的问题。多年来发生了几次,但我从来没有弄清楚为什么。总是通过重新安排我现有的代码来解决它,但是想知道是否有更合适的处理方式,或者至少弄清楚它背后的内容。

非工作版本:

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
}

问题是:frame null(至少根据调试器,以及我可以跟踪代码的任何措施),但是当它执行if (frame == null)检查时,它出来是真的并抛出异常。我重写了检查cache.CacheData并且它工作正常,但它确实不应该对代码逻辑产生任何影响。

我设法在网站上找到一个类似问题的另一个问题,最终与==和!=运算符重载有关。这些运算符在我的代码中没有为有问题的类重载,而且它是一个独立的类,所以它没有任何东西可以继承。

编辑:John Saunders请求CacheData属性的代码:

private DataArray cacheData;

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

1 个答案:

答案 0 :(得分:0)

看起来你正在映射非工作的异常,然后调用 DataArray frame = cache.CacheData; 但是如果cache.CacheData如果为null然后你将它分配给DataFrame,那么我认为在分配或假设你的第二个看起来很好之前首先检查null是最好的..或许你可以抛出异常捕获异常并为两种情况尝试一些测试用例