通过记录与将类传递给过程时如何进行

时间:2018-12-12 16:06:13

标签: pascal delphi

让我们说我有一个名为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;

现在我的代码看起来像这样,但是我想知道是否还有更好的方法?我是否违反了对象Pascal / Delphi代码约定?仅将TProgramSettings记录下来会更好吗?我真的不明白Records和Classs之间的区别,我只知道必须初始化类。在我将TProgramSettings记录为已读内容的情况下,我不应该将指针传递给它,因为该记录指向内存中的相同地址,不需要像类一样被引用。我应该怎么做?任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:2)

类型为class的对象已经是一个指针,因此确实不需要像您那样取消引用它。等效为

TProgramSettings = class
   flags: UInt32;
   ...
end;

...

var
  MyProgramSettings: TProgramSettings;
begin
  MyProgramSettings := TProgramSettings.Create;
  MyProgramSettings.Flags := 0;
  ApplySettings(MyProgramSettings);

...

procedure ApplySettings(ProgramSettings: TProgramSettings);
var
  MyObject : TCustomObject;
begin
  MyObject := TCustomObject.Create;
  MyObject.Settings.Flags := ProgramSettings.Flags;
  ...
end;

关于记录和类对象之间的区别,一种思考方式是,当您将记录定义为var时,该定义将创建记录(无需调用“ Create”),而对于一个类,您只是在创建指向对象的指针,而您仍然需要创建对象本身。除此之外,还有很多事情要做,但是现在开始考虑吧。