首页 > 解决方案 > 无法检查是否已创建类

问题描述

我在delphi中创建了一个类。看起来像这样

    TGoJsNode = class(TPersistent)
      private
        _id: Integer;
        Key: Integer;
        Text: String;

        constructor Create;
    end;

我需要检查何时有效地创建了此类(使用了构造函数)。例如,当我这样做时:

var
  x: TGoJsNode;
begin
  if Assigned(x) then
     // Will return True
     showmessage('created');

  if x = nil then   
     // Will also return True
     showmessage('created');
end;

这两个测试都将导致 true,而事实上我并没有创建 x。在我看来,当我创建它时,x 应该只在分配的测试中产生 true,如下所示:

procedure TForm1.Button18Click(Sender: TObject);
var
  x: TGoJsNode;
begin
  x := TGoJsNode.Create;
end;

我观察到的另一件奇怪的事情是私有数值变量具有随机值,而字符串一个是空的。所有的类都在同一个单元文件中。有任何想法吗?

标签: delphi

解决方案


一切都按设计和预期运行。问题是您的期望是基于不正确的理解。

非托管局部变量是未初始化的,因此它们的值是未定义的,直到它们被显式初始化。所以你的变量x可以有任何值,直到你初始化它。

Assigned()函数测试指针变量是否为nil. 在初始化变量之前,返回的值Assigned()是未定义的。有关更广泛的讨论,请参阅此答案Assigned()

局部变量未初始化规则的一个例外是托管类型。它们总是被初始化。字符串是托管类型,这解释了为什么您会看到它们始终为空。数值类型不受管理,因此不会自动初始化。

其他托管类型包括移动平台上的动态数组、接口、变体、匿名方法和 ARC 类。此外,包含托管类型的结构化类型(例如实例记录和数组)本身也成为托管类型。

另一个细微差别是全局变量和类成员是默认初始化的。只有局部变量可能不会被初始化。


推荐阅读