代码:
CogFindCircleLastRunRecordConstants.BestFitCircle;
CogFindCircleTool_.Run();
if ((CogFindCircleTool_.Results.GetCircle() != null) && (CogFindCircleTool_.Results.GetCircle().Visible == true))
{
cogRecordDisplay1.Record = CogFindCircleTool_.CreateLastRunRecord().SubRecords["InputImage"];
答案 0 :(得分:0)
此错误是因为.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
),否则条件为{{1} }将被评估:
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() + ")");
方法的结果,而不是一遍又一遍地调用它,这需要额外的处理周期。这也将使代码更短,更易读。还可以使用string interpolation而不是级联缩短代码多一点。
您还提到,内线仍然收到null引用异常,这仅意味着GetCircle()
为null(据我所知)。如果是这样,我们可以在调用Label
方法时使用?.
运算符:
SetXYText
请注意,如果某些内容为null,则上面的代码将不执行任何操作。如果您想在// 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
运算符:< / p>
?.