我在论坛上读了很多关于指针、Assigned
函数、Free
函数、FreeAndNil
函数等的帖子...我已经知道 Free函数不会删除对分配的对象的指针引用,而 FreeAndNil 会执行此操作...我读到的所有帖子都考虑到该主题已执行 Create 方法,或者在其他方法中换句话说,考虑到已经创建的对象。
我的问题是:为什么Assigned
函数对于未初始化的对象变量返回true?
举个例子:
procedure TForm1.FormCreate(Sender: TObject);
var
Qry: TADOQuery;
begin
if Assigned(Qry) then
ShowMessage('Assigned')
else
ShowMessage('Unassigned');
Qry := TADOQuery.Create(nil);
if Assigned(Qry) then
ShowMessage('Assigned')
else
ShowMessage('Unassigned');
end;
该示例显示“已分配”两次!
结论:在声明 Qry
后、执行其 create 方法之前,指向 Qry
的指针不是 NIL
!
如果我将 Qry := nil;
放在上面的过程的第一行,一切正常......它显示“未分配”和“已分配”。
为什么?
是否有任何安全的方法可以知道类变量是否已经执行了其 create 方法?
最佳答案
您的变量是局部变量,因此未初始化。它可以包含任何值。
On the Win32 platform, the contents of a local variable are undefined until a value is assigned to them.
请注意,作为实现细节,某些类型是托管的,甚至托管类型的局部变量也会被初始化。托管类型的示例包括:字符串、接口(interface)、动态数组、匿名类型和变体。
你问:
Is there any safe way to know if a class variable already has its create method executed?
如果该变量是局部变量,则答案是否定的。这个责任就落到了程序员的身上。在实践中,这很少是一个问题,因为好的代码具有简短的过程,这使得您更难出错。即使您这样做,编译器也会总是警告您。
其他类型的变量(例如类字段和全局变量)被初始化。
关于delphi - 为什么Assigned 对于未初始化的变量返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168998/