您的理解有误。对于非托管类型(即非引用计数类型)的局部变量,它们不会被初始化。在使用它们之前,您必须先为它们赋值。
根据
XE5 documentation(请参阅“声明变量”部分的底部 - 我在 Wiin32 中包含了类型错误,但强调是我的):
如果您没有明确初始化全局变量,则编译器将其初始化为0。对象实例数据(字段)也将初始化为0。在Win32平台上,本地变量的内容在分配值之前未定义。
请注意,每当Emba写“Win32”时,他们指的是非ARC编译器,因此上述内容也适用于Win64和OSX。
您可以在Delphi 2007中使用搜索术语“Variables”在帮助索引中找到相同的信息;它位于“variables VBScript”和“variables [OpenGL]”之间。
您看到的Win64调试构建的差异可能只是编译器所做的事情,或者是幸运的巧合,或者完全是其他原因。但这并不重要。正如您所知道的,本地变量默认情况下未初始化,因此在使用它们之前,请确保在所有情况下都进行了初始化。这不是一个难以执行的规则;当您声明本地变量时,只需遵循这个规则即可。请注意,保留HTML标签。
var
MyObj: TSomething;
你可以自己分配一个值,或者使用代码中其他地方接收到的值:
MyObj := TSomething.Create; // Created yourself
MyObj := GetSomething(); // Function result
MyObj := Self.SomethingCollection[Self.SomethingCount - 1]; // Local ref
没有任何理由需要依赖于局部变量的初始化与否,因为可以在将外部引用分配给局部变量之前对外部引用进行测试,或在分配外部引用后对局部变量进行测试:
if SomethingIGot = nil then
raise Exception.Create('Received a nil parameter');
MyObj := SomethingIGot;
MyObj := SomethingIGot;
if not Assigned(MyObj) then
raise Exception.Create('MyObj was assigned a nil value');
MyObj := TSomething.Create;
),或者分配其他地方创建的内容(MyObj := SomeParam
或MyObj := SomeFunctionResult
)。不必要的初始化不会有任何影响(例如,MyString := ''
不会有任何影响,即使字符串是托管类型并已初始化为''
)。 - Ken White