1

所以我有一个 Retrieve() 函数,它要么给我一个对象,要么给我一个空值(如果找不到那个对象)。我正在使用带有该对象的布尔属性的 if 语句。它是这样设置的。

if(Retrieve(index).IsForm == true) {}

这样做的问题是,如果它没有找到一个对象,它会抛出一个空引用异常。当然,有一些方法可以解决这个问题,但我觉得没有一个是简洁的。有一个尝试...捕获,但是当我期望错误时,这似乎毫无意义。我可以先检查对象是否为空if(Retrieve(index) != null),但这似乎添加了不必要的嵌套。有没有聪明的方法来处理这个?我想过使用空合并运算符,但在这种情况下它不起作用。

4

6 回答 6

2

您可以调用该方法两次:

if(Retrieve(index) != null && Retrieve(index).IsForm == true) { }

或者您可以将这些行分开并将结果存储在 if 之前:

var result = Retrieve(index);
if(result != null && result.IsForm == true) { }
于 2012-08-24T17:00:36.673 回答
2

您可以编写一个IsForm函数来为您执行这两项操作:

bool IsForm(int index)
{
    var result = Retrieve(index);
    return result != null && result.IsForm;
}

if (IsForm(index))
    ...
于 2012-08-24T17:03:53.237 回答
1

空对象模式在这里会很有帮助。它使您的调用代码保持干净,但确实添加了一个额外的类。

class NullWhatever : Whatever
{
    public NullWhatever() { IsForm = false; } 
}


Whatever Retrieve(...) 
{
     ...
     return new NullWhatever();  // instead of null
}
于 2012-08-24T17:02:47.713 回答
1

您可以创建一个 Nullable_IsForm 扩展方法。然后你可以检查空条件。

public static class RetrieveExtension
{
    public static bool? Nullable_IsForm(this Retrieve retrieved)
    {
        if(retrieved == null)
        {
            return null;
        }
        else
        {
            return retrieved.IsForm;
        }
    }
}

然后在您的代码中,您将根据bool值检查它

if(Retrieve(index).Nullable_IsForm == true) 
{}
else if (Retrieve(index).Nullable_IsForm == false) 
{}
else if (Retrieve(index).Nullable_IsForm == null ) 
{}
于 2012-08-24T17:09:42.337 回答
0

我认为没有更简洁的方法可以做到这一点,不。

我能想到的最短的是:

if(Retrieve(index)!=null && Retrieve(index).IsForm == true) {}

但我不喜欢这样,因为它会Retrieve(index)多次调用。我会去

var foo = Retrieve(index);
if(foo!=null && foo.IsForm == true) {}

但这显然没有做任何聪明或更简洁的事情。它可能比某些替代方案更有效。

于 2012-08-24T17:02:06.313 回答
0

你可以把这两个条件放在同一个if

if(Retrieve(index)!= null && Retrieve(index).IsForm == true) {}

由于短路,如果空值检查失败,则不会评估表达式的其余部分。

于 2012-08-24T17:04:29.020 回答