Delphi - 分配给'x'的值从未使用过

时间:2012-06-13 05:29:02

标签: delphi compiler-warnings

假设我有以下代码:

function DoSomething:Boolean;
var obj : TMyObject;
i : Integer;
begin
  Result := False; //We haven't executed GetValue() correctly yet
  obj := TMyObject.Create();
  try
    //perform some code that may produce an exception        
    i := obj.GetValue();
    //Set the return to True as we executed GetValue() successfully
    Result := True;
  finally
    //do some cleanup
    obj.Free; 
  end;
end;

Delphi编译器抱怨分配给Result的值从未在第一行使用。

我可能遗漏了一些明显的东西,但我不明白为什么编译器会优化它(如果优化已经开启)。

我一直被教导要明确设置我的变量,以免混淆他们的价值观。最重要的是,如果GetValue()函数生成异常,Result := True;行将永远不会执行。因此,无论Delphi初始化变量是什么,我们都会受到支配。

这是安全/可接受的代码吗?我应该简单地删除方法的第一行,这会使它更难阅读吗?如果失败,我将不得不关闭特定的编译器警告,但我不愿意这样做,因为此警告消息可以提供有用的信息。

2 个答案:

答案 0 :(得分:15)

编译器是正确的。将False赋值给结果是徒劳的,函数可以返回的唯一值是True。

两种可能的执行路径是:

  1. 该函数不会引发异常并返回True。
  2. 该函数确实引发异常,因此根本不返回结果值。
  3. 解决方案很简单,删除将Result设置为False的代码行。在这一点上,完全清楚的是返回值没有用处,您可以简单地将函数转换为过程。

答案 1 :(得分:4)

您的功能只有两个结果。要么返回True,要么它会引发异常,因此您可以将其转换为过程而不是使警告消失。

如果您希望在False引发异常时函数的结果为GetValue(),则必须在DoSomething中捕获该异常,并将返回值设置为False 。在这种情况下,您应该启动函数将返回值初始化为True

这样的事情:

function DoSomething:Boolean;
var
  obj : TMyObject;
  i: Integer;
begin
  Result := True;
  obj := TMyObject.Create();
  try
    try
      i := obj.GetValue();
    except
      Result := False;
    end;
  finally
    obj.Free;
  end;
end;