请查看以下代码摘录:
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对象。 正确吗?第二种实现真的可以改善某些东西吗?有什么缺点吗?
答案 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;