Delphi 无法检查是否已创建类

Delphi 无法检查是否已创建类,delphi,Delphi,我用delphi创建了一个类。看起来像这样 TGoJsNode = class(TPersistent) private _id: Integer; Key: Integer; Text: String; constructor Create; end; 我需要检查这个类何时被有效地创建并使用构造函数。例如,当我这样做时: var x: TGoJsNode; begin if Assigned

我用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应该只在我创建它时在指定的测试中为真,如下所示:

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

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

一切都按照设计和预期进行。问题是你的期望是建立在错误的理解上的

非托管局部变量是未初始化的,因此它们的值在显式初始化之前是未定义的。因此,在初始化变量x之前,它可以有任何值

分配的函数测试指针变量是否为nil。在初始化变量之前,赋值返回的值是未定义的。请参阅此,了解有关分配的更广泛的讨论

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

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


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

我已经记不清我的问题和你的答案被引用了多少次了。我甚至记得你在用户档案中提到过它。@RemyLebeau谢谢你的编辑。我对“随机”这个词有一个很小的争议。虽然它可能看起来是随机的,但值完全可以是确定性的,并且由早期代码留下的堆栈内容决定。我不想在这里使用random这个词,因为接下来的问题是,每次我运行函数时,值都是相同的,但你说它是随机的……虽然字符串总是有效的,但它们不一定是空的,我发现。@Golez它们总是初始化为空字符串。如果你找到一个非空值的变量,你的代码中会有一些东西分配给这个变量。谢谢@DavidHeffernan,这些链接帮了我很多