这个问题已经在这里有一个答案:
码:
CogFindCircleLastRunRecordConstants.BestFitCircle;
CogFindCircleTool_.Run();
if ((CogFindCircleTool_.Results.GetCircle() != null) && (CogFindCircleTool_.Results.GetCircle().Visible == true))
{
cogRecordDisplay1.Record = CogFindCircleTool_.CreateLastRunRecord().SubRecords["InputImage"];
这个错误是因为.Results
是null
,但你试图调用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
第一。
下面,如果Results
是null
或GetCircle
返回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)})");
}
需要注意的是,如果事情是空上面的代码不会做任何事情。如果您想要做别的事情,如果circle
是null
或Label
是null
,那么你应该明确地检查,而不是使用?.
操作:
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)})");
}
}