当我调用函数来获取值时,我通常会初始化变量,以防函数失败或不返回任何内容,并且我想避免处理未初始化的变量。我对字符串、整数或任何其他类型做同样的事情。
整数变量的示例:
vPropValue := 0;
vPropValue := GetPropValue(vObject,'Height');
IF vPropValue > 0 Then
...
这是我最常见的使用方式。
我知道我可以使用:
If GetPropValue(vObject,'Height') > 0 Then
...
但是对于第一个示例,如果稍后在代码中再次需要结果,我会避免多次调用函数。
字符串相同(即使我知道本地字符串被初始化为空字符串,而整数不是可以保存任何值)
vName := '';
vName := GetObjectName(vObject,'ObjectName');
IF Trim(vPropStrValue) <> '' Then
...
我知道我可以采取措施避免重复的赋值,比如确保 Function 在一切都失败时返回 0。但是我有 100 个函数,我不能依赖我从来没有犯过函数如何处理所有事情的错误,我敢肯定,如果一切都失败了,有些函数不会返回 0。
我试图理解为什么这不是可取的做法以及如何最好地避免它。
编辑
这是函数没有返回正确值或 0 的示例:
function GetValue(vType:integer):integer;
begin
if vType=1 then
Result:=100
else if (vType>2) and (vType<=9) then
Result:=200;
end;
procedure TForm1.Button1Click(Sender: TObject);
var vValue:integer;
begin
vValue:=GetValue(11);
Button1.Caption:=IntToStr(vValue);
end;
在这种情况下,函数返回的值是某个随机数。
在这种情况下,初始化似乎是有效的方法。或不?
编辑2:
正如大卫在他的回答中指出的那样,正确,有一个警告
[dcc32 Warning] Unit1.pas(33): W1035 Return value of function 'GetValue' might be undefined
但是,我无缘无故地忽略了它,只是没有看那里。因为它让我编译它,我认为它没问题。因此,我确实寻找了警告并“修复”了很多具有类似问题的函数,因为所有 IF 结果可能尚未定义。
编辑 3 和结论:
我希望它增加了问题和解释的范围:
也许我在我的大多数函数中使用的另一个扭曲的例子也可以解释为什么我认为我的变量初始化是必要的,我不确定我的函数是否会一直正确运行,尤其是在嵌套函数的情况下. 他们中的大多数仍然是这样设置的:
function GetProperty(vType:integer):integer;
begin
Try
if vType = 99 then
Result:=GetDifferentProperty(vType)// <-- Call to another Function, that could return whatever...
else
begin
if vType=1 then
Result:=100
else if (vType>2) and (vType<=9) then
Result:=200;
end;
except
end;
end;
现在我正在解决这些问题Try Except End;
,但有些功能已经有 10 年的历史了,根据我当时的经验,期望它们能够 100% 工作,并不是可以依赖的。
作为该项目的唯一开发人员,我认为我应该信任我的函数(以及我的其余代码),但我无法想象在多个开发人员环境中所有函数都已正确设置。
所以我的结论是:由于我没有处理基础知识——正确设计的函数,我需要进行所有这些检查(变量初始化、Try Except
行..)以及可能一些其他不必要的东西。