首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >或者使用内部“如果”更好

或者使用内部“如果”更好
EN

Software Engineering用户
提问于 2012-10-29 22:05:46
回答 8查看 2.4K关注 0票数 8

在这种情况下:“

代码语言:javascript
复制
if ((metadata != null) && (metadata.TypeEnum != VariantInfoMetadata.CellTypeEnum.Status))

您建议保留上面的代码吗?还是最好创建一个嵌套的" if“语句,并将条件分解为两个部分,其中”外层if“确保元数据不为空,而内部则由if执行其余的检查。我认为,如果元数据的值为空,嵌套的if将处理可能的空引用异常。

EN

回答 8

Software Engineering用户

回答已采纳

发布于 2012-10-29 22:13:44

&&||在许多语言(C、C++、Java、C#)中都是短路的,这意味着一旦知道答案,它就停止了评估。如果您的语言是一种短路语言,则不需要嵌套的if,因为一旦metadata != null的计算结果为false,整个表达式的计算就会停止,从而防止了空引用。事实上,短路(逻辑) ANDs和ORs是专门为处理你所描述的情况而发明的,而不需要创造额外的嵌套级别。

票数 11
EN

Software Engineering用户

发布于 2012-10-29 22:42:59

你拥有的一切都是完美的。很清楚很简单。

如果有几个用例测试为null,我会将它们组合起来。这是不好的,因为它反复测试(metadata != null)

代码语言:javascript
复制
if ((metadata != null) && (metadata.TypeEnum != CellTypeEnum.Status))
{ ... }
else if ((metadata != null) && (metadata.TypeEnum != CellTypeEnum.Info))
{ ... }
else if ((metadata != null) && (metadata.TypeEnum != CellTypeEnum.Blank))
{ ... }

这样做更好:

代码语言:javascript
复制
if (metadata != null)
{
    if (metadata.TypeEnum != CellTypeEnum.Status)
    { ... }
    else if (metadata.TypeEnum != CellTypeEnum.Info)
    { ... }
    else if (metadata.TypeEnum != CellTypeEnum.Blank)
    { ... }
}

甚至更好的是:

代码语言:javascript
复制
if (metadata != null)
{
    switch (metadata.TypeEnum) {
        case CellTypeEnum.Status:
            //do stuff
            break;
        case CellTypeEnum.Info:
            //do stuff
            break;
        case CellTypeEnum.Blank:
            //do stuff
            break;
    }
}
票数 17
EN

Software Engineering用户

发布于 2012-10-29 22:25:41

另一种方法是使用空对象模式

与显式检查null不同,您总是返回一个实例,因此在本例中,您将拥有(伪代码):

代码语言:javascript
复制
public class NullMetadata
{
    VariantInfoMetadata TypeEnum { get; set; }

    public NullMetadata()
    {
        TypeEnum = VariantInfoMetadata.None
    }
}

然后,代替

代码语言:javascript
复制
var metadata = null

你会有

代码语言:javascript
复制
var metadata = new NullMetadata()

对于VariantInfoMetadata.CellTypeEnum.Status的检查总是返回false。

票数 6
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/171815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档