无法检查是否已创建课程

时间:2019-08-06 20:08:00

标签: delphi

我在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;

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

1 个答案:

答案 0 :(得分:4)

一切都按设计和预期进行。问题在于您的期望基于错误的理解。

非托管局部变量是未初始化的,因此它们的值是不确定的,直到它们被显式初始化为止。因此,变量x在初始化之前可以具有任何值。

Assigned()函数测试指针变量是否为nil。在初始化变量之前,Assigned()返回的值是不确定的。有关Assigned()的更广泛讨论,请参见answer

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

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

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