首页 > 解决方案 > 传递记录与将类传递给过程时如何进行

问题描述

假设我有一个名为 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 设置为我读过的记录的情况下,我不应该将指针传递给它,因为该记录指向内存中的相同地址,并且不需要像类一样被引用。我应该怎么做?任何帮助将不胜感激:)

标签: pascaldelphi

解决方案


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 时,该定义会创建记录(无需调用“创建”),而对于一个类,您只是创建一个指向对象的点,您仍然需要创建对象本身。还有很多事情要做,但要开始考虑它已经很遥远了。


推荐阅读