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

Delphi—分配给'的值;x';从未使用过,delphi,compiler-warnings,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 :

假设我有以下代码:

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()
函数生成异常,
结果:=True行将永远不会执行。因此,无论Delphi将变量初始化为什么,我们都将任由其摆布


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

您的函数只有两个结果。它要么返回
True
,要么引发异常,这样您就可以将其转换为一个过程来消除警告

如果在
GetValue()
引发异常时希望函数结果为
False
,则必须在
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;

编译器是正确的。将False赋值给Result是徒劳的,函数只能返回True

两种可能的执行路径是:

  • 该函数不会引发异常并返回True
  • 该函数确实引发异常,因此根本不返回结果值

  • 解决方案很简单,删除将结果设置为False的代码行。在这一点上,很明显返回值没有任何作用,您可以简单地将函数转换为一个过程。

    因此我应该有一个嵌套的
    try(如果这是您想要的。当函数
    DoSomething
    向调用者引发异常时,您不应使用该函数的返回值,因此不应使用将结果初始化为
    False
    。您可以在
    DoSomething
    中处理异常,也可以在更高的级别上执行此操作..-1此答案错误严重问题中的e会引发异常。此答案中的代码会吞噬异常。这两段代码的行为截然不同。@DavidHeffernan我猜您错过了我答案的这一部分“如果您想要函数的结果…”。是的,它会改变函数的行为。我理解不要吞咽所有异常。在我的特定实例中,抛出异常并继续执行应用程序是可以的。关于编译器如何处理
    结果的想法,如果不初始化它,答案是什么。请参阅。