使用异常机制代替“ if”来处理Delphi中的默认对象参数

时间:2018-06-26 07:50:01

标签: delphi

请查看以下代码摘录:

TCustomPoint = class
  private
    //many other fields
    mPoint: TPoint;
  public
    //many other stuff: constructor, destructor, methods, etc.
    function ToPoint(Axis: TAxis = nil);  
end;

ToPoint实现中,如果要传递Axis对象,我想做些什么,如果没有,则要做另一件事。因此,显而易见的实现是:

function TCustomPoint.ToPoint(Axis: TAxis = nil): TPoint;
begin
  if Assigned(Axis) then
    Result:=Axis.Reallocate(Self.mPoint);
  else
    Result:=Self.mPoint;
end;

,但是此方法将在成千上万的{{​​1}}对象上调用,有时会传递一个Axis,所以我想知道是否可以使用异常机制而不是TCustomPoint来提高性能。像这样:

if

看起来我只是捕获了一个function TCustomPoint.ToPoint(Axis: TAxis = nil): TPoint; begin try Result:=Axis.Reallocate(Self.mPoint); except on E: EAccessViolation do Result:=Self.mPoint; end; 异常,所以如果有任何其他类型的异常,它将不会由我管理,因此将按预期方式引发。在此示例中,发生EAccessViolation异常的唯一方法是访问空的Axis对象。 正确吗?第二种实现真的可以改善某些东西吗?有什么缺点吗?

1 个答案:

答案 0 :(得分:6)

通常情况下,与简单的分配检查相比,异常会严重降低应用程序的速度。

相反,您可以声明两个 overloaded 方法,以便编译器为您进行检查:

function TCustomPoint.ToPoint: TPoint;
begin
  Result:=Self.mPoint;
end;

function TCustomPoint.ToPoint(Axis: TAxis): TPoint;
begin
  Result:=Axis.Reallocate(Self.mPoint);
end;

请注意,这种方法将无法捕获在运行时给出nil轴的情况,因此我建议您将第一种方法用于该实现。

function TCustomPoint.ToPoint(Axis: TAxis): TPoint;
begin
  if Assigned(Axis) then
    Result:=Axis.Reallocate(Self.mPoint);
  else
    Result:=Self.mPoint;
end;