pascal - 传递记录与将类传递给过程时如何进行
问题描述
假设我有一个名为 TProgramSettings 的类,如下所示:
TProgramSettings = class
flags: UInt32;
...
end;
PProgramSettings = ^TProgramSettings;
所以我像这样初始化我的程序:
var
MyProgramSettings: TProgramSettings;
begin
MyProgramSettings := TProgramSettings.Create;
MyProgramSettings.Flags := 0;
ApplySettings(@MyProgramSettings);
ApplySettings 过程如下所示:
procedure ApplySettings(ProgramSettings: PProgramSettings);
var
MyObject : TCustomObject;
begin
MyObject := TCustomObject.Create;
MyObject.Settings.Flags := ProgramSettings^.Flags;
...
end;
现在我的代码看起来像这样,但是我想知道是否有更好的方法来做到这一点?我是否违反了 Object Pascal/Delphi 代码约定?让 TProgramSettings 成为记录会更好吗?我真的不明白记录和类之间的区别,我只知道类必须初始化。在我将 TProgramSettings 设置为我读过的记录的情况下,我不应该将指针传递给它,因为该记录指向内存中的相同地址,并且不需要像类一样被引用。我应该怎么做?任何帮助将不胜感激:)
解决方案
class 类型的对象已经是一个指针,因此确实不需要像您那样取消引用它。等效的是
TProgramSettings = class
flags: UInt32;
...
end;
…</p>
var
MyProgramSettings: TProgramSettings;
begin
MyProgramSettings := TProgramSettings.Create;
MyProgramSettings.Flags := 0;
ApplySettings(MyProgramSettings);
…</p>
procedure ApplySettings(ProgramSettings: TProgramSettings);
var
MyObject : TCustomObject;
begin
MyObject := TCustomObject.Create;
MyObject.Settings.Flags := ProgramSettings.Flags;
...
end;
关于记录和类对象之间的区别,嗯,一种思考方式是,当您将记录定义为 var 时,该定义会创建记录(无需调用“创建”),而对于一个类,您只是创建一个指向对象的点,您仍然需要创建对象本身。还有很多事情要做,但要开始考虑它已经很遥远了。
推荐阅读
- sql - Oracle SQL:如何复制一行并修改语句中的某些值?
- android-studio - Android Studio 无法解析配置“:classpath”的所有工件
- salesforce - 带有 Case/If 语句的字段公式
- javascript - 将 Javascript 中的 JSON 对象数组从“Apple and Orange”更改为“Apple”“Orange”
- python - 什么是实现或执行 键为 0,1,2,.. 的字典与 python 中的列表之间的区别
- assembly - 此代码是否适用于 scanf(); 功能工作?(NASM 16 位)
- javascript - 基本的 Javascript、CSS、HTML
- gcc - 链接描述文件中的一个部分之后的“=0”是什么?
- visual-studio-code - 使用 VSCode 扩展的 AOUTH 调用 API
- c# - 在 Linux 应用服务的 docker 容器中运行 .Net Core 控制台应用