在这种情况下:“
if ((metadata != null) && (metadata.TypeEnum != VariantInfoMetadata.CellTypeEnum.Status))您建议保留上面的代码吗?还是最好创建一个嵌套的" if“语句,并将条件分解为两个部分,其中”外层if“确保元数据不为空,而内部则由if执行其余的检查。我认为,如果元数据的值为空,嵌套的if将处理可能的空引用异常。
发布于 2012-10-29 22:13:44
&&和||在许多语言(C、C++、Java、C#)中都是短路的,这意味着一旦知道答案,它就停止了评估。如果您的语言是一种短路语言,则不需要嵌套的if,因为一旦metadata != null的计算结果为false,整个表达式的计算就会停止,从而防止了空引用。事实上,短路(逻辑) ANDs和ORs是专门为处理你所描述的情况而发明的,而不需要创造额外的嵌套级别。
发布于 2012-10-29 22:42:59
你拥有的一切都是完美的。很清楚很简单。
如果有几个用例测试为null,我会将它们组合起来。这是不好的,因为它反复测试(metadata != null)。
if ((metadata != null) && (metadata.TypeEnum != CellTypeEnum.Status))
{ ... }
else if ((metadata != null) && (metadata.TypeEnum != CellTypeEnum.Info))
{ ... }
else if ((metadata != null) && (metadata.TypeEnum != CellTypeEnum.Blank))
{ ... }这样做更好:
if (metadata != null)
{
if (metadata.TypeEnum != CellTypeEnum.Status)
{ ... }
else if (metadata.TypeEnum != CellTypeEnum.Info)
{ ... }
else if (metadata.TypeEnum != CellTypeEnum.Blank)
{ ... }
}甚至更好的是:
if (metadata != null)
{
switch (metadata.TypeEnum) {
case CellTypeEnum.Status:
//do stuff
break;
case CellTypeEnum.Info:
//do stuff
break;
case CellTypeEnum.Blank:
//do stuff
break;
}
}发布于 2012-10-29 22:25:41
另一种方法是使用空对象模式。
与显式检查null不同,您总是返回一个实例,因此在本例中,您将拥有(伪代码):
public class NullMetadata
{
VariantInfoMetadata TypeEnum { get; set; }
public NullMetadata()
{
TypeEnum = VariantInfoMetadata.None
}
}然后,代替
var metadata = null你会有
var metadata = new NullMetadata()对于VariantInfoMetadata.CellTypeEnum.Status的检查总是返回false。
https://softwareengineering.stackexchange.com/questions/171815
复制相似问题