【发布时间】:2010-04-26 22:29:42
【问题描述】:
我最近遇到了一个看起来像这样的例程:
procedure TMyForm.DoSomething(list: TList<TMyObject>; const flag: boolean);
var
local: integer;
begin
if flag then
//do something
else local := ExpensiveFunctionCallThatCalculatesSomething;
//do something else
for i := 0 to list.Count do
if flag then
//do something
else if list[i].IntValue > local then //WARNING HERE
//do something else
end;
这会给出Variable 'local' might not have been initialized,即使您可以通过阅读代码来判断除非初始化它的代码分支已经运行,否则您不会点击该行。
现在,我可以通过在程序顶部添加一个无用的local := 0; 来消除此警告,但我想知道是否可能没有更好的方法来构造它以避免此问题。有人有什么想法吗?
【问题讨论】:
-
我认为预初始化变量是一种很好的做法,因为它们指向内存中的随机数据,如果你不注意它可能会导致你的应用程序出现意外行为 :) C# 我认为不会甚至允许您运行该代码,因为本地未初始化。
-
哦,我知道这是个好习惯。我只是想知道是否没有更好的方法来编写不需要初始化的代码以避免收到警告。 (关闭警告是作弊。)
-
我猜编译器并没有那么复杂。它可能只是看到本地可能被初始化。
-
“即使你可以通过阅读代码知道除非初始化它的代码分支已经运行,否则你不会到达那一行”——编译器很聪明,但不是那么聪明。这是您正在做的一件微妙的事情,以确保 local 如果未初始化则永远不会被访问,并且它会在警告方面出错。
-
确实应该有人指出循环计数器上的索引溢出。 ;)
标签: delphi refactoring compiler-warnings