C#康耐视,他为什么说空引用异常[复制]

问题描述 投票:-2回答:1

这个问题已经在这里有一个答案:

enter image description here

码:

CogFindCircleLastRunRecordConstants.BestFitCircle;
        CogFindCircleTool_.Run();

        if ((CogFindCircleTool_.Results.GetCircle() != null) && (CogFindCircleTool_.Results.GetCircle().Visible == true))
        {
            cogRecordDisplay1.Record = CogFindCircleTool_.CreateLastRunRecord().SubRecords["InputImage"];
c# vision
1个回答
0
投票

这个错误是因为.Resultsnull,但你试图调用GetCircle()方法就可以了。

处理的方法之一是使用null-conditional operator?.),它返回null如果左侧为空,否则与右手边的方法或属性继续:

// If Results is null, the call to GetCircle will not happen, and the result will be null
// Not needed on the second condition, since '&&' would return 'false' right away
if ((CogFindCircleTool_.Results?.GetCircle() != null) &&  
    (CogFindCircleTool_.Results.GetCircle().Visible == true))

你甚至可以进一步缩短你的代码通过访问.?属性时加入另一个Visible,然后我们并不需要明确检查.GetCircle() != null第一。

下面,如果ResultsnullGetCircle返回null,表达式将失败(因为null != true),否则条件Visible == true将被评估:

if (CogFindCircleTool_.Results?.GetCircle()?.Visible == true)

在评论,你说,你有if语句中这样一行:

Label.SetXYText(CogFindCircleTool_.Results.GetCircle().CenterX, 
    CogFindCircleTool_.Results.GetCircle().CenterY, "(" + 
    Math.Round(CogFindCircleTool_.Results.GetCircle().CenterX, 3).ToString() + 
    "," + Math.Round(CogFindCircleTool_.Results.GetCircle().CenterY, 3).ToString() + ")");

提高性能的一件事是捕获结果的FO方法GetCircle()一次,而不是调用它一遍又一遍,这需要额外的处理周期。这也将使得代码更短,更具可读性。您还可以使用string interpolation而不是串联的缩短码多一点。

您也提到,你仍然得到在内线上的空引用异常,这只能意味着Label为空(从我可以告诉)。如果是这样,我们可以调用?.方法时使用SetXYText操作:

// Capture the result of GetCircle() once
var circle = CogFindCircleTool_?.Results?.GetCircle();

if (circle?.Visible == true)
{
    Label?.SetXYText(circle.CenterX, circle.CenterY, 
        $"({Math.Round(circle.CenterX, 3)},{Math.Round(circle.CenterY, 3)})");
}

需要注意的是,如果事情是空上面的代码不会做任何事情。如果您想要做别的事情,如果circlenullLabelnull,那么你应该明确地检查,而不是使用?.操作:

if (circle == null) 
{ 
    // do something if circle is null 
} 
else if (circle.Visible == true) 
{ 
    if (Label == null) 
    { 
        // do something if Label is null 
    } 
    else 
    { 
        Label.SetXYText(circle.CenterX, circle.CenterY, 
            $"({Math.Round(circle.CenterX, 3)},{Math.Round(circle.CenterY, 3)})");
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.