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;
我观察到的另一件奇怪的事情是私有数值变量具有随机值,而字符串一个是空的。所有的类都在同一个单元文件中。有任何想法吗?
解决方案
一切都按设计和预期运行。问题是您的期望是基于不正确的理解。
非托管局部变量是未初始化的,因此它们的值是未定义的,直到它们被显式初始化。所以你的变量x
可以有任何值,直到你初始化它。
该Assigned()
函数测试指针变量是否为nil
. 在初始化变量之前,返回的值Assigned()
是未定义的。有关更广泛的讨论,请参阅此答案Assigned()
。
局部变量未初始化规则的一个例外是托管类型。它们总是被初始化。字符串是托管类型,这解释了为什么您会看到它们始终为空。数值类型不受管理,因此不会自动初始化。
其他托管类型包括移动平台上的动态数组、接口、变体、匿名方法和 ARC 类。此外,包含托管类型的结构化类型(例如实例记录和数组)本身也成为托管类型。
另一个细微差别是全局变量和类成员是默认初始化的。只有局部变量可能不会被初始化。
推荐阅读
- c# - System.TypeLoadException:“MySql.Data.EntityFrameworkCore.Query.Internal.MySQLSqlTranslatingExpressionVisitorFactory”类型中的方法“创建”
- angular - 带有新选项的 Highcharts Angular 更新图表 - 包括链接系列
- macos - 通过 NSAppleScript 发送击键时出现错误 1002
- java - JPA Native Query - 导致未知列错误的参数,未转换为字符串
- firebase - Firebase 安全规则不起作用 - 无法弄清楚原因
- html - 如何在旁边显示固定文本
- php - Firebase 数据库查找密钥
- c++ - 在进行文本频率分析时出现浮点异常错误?
- ffmpeg - 评估 vmaf 时出现损坏的帧错误
- vue.js - Vue 组件中带有加载器的 Storybook 6.1x Args 功能