Pascal 传递记录与将类传递给过程时如何继续

Pascal 传递记录与将类传递给过程时如何继续,pascal,delphi,Pascal,Delphi,假设我有一个名为TProgramSettings的类,它如下所示: TProgramSettings = class flags: UInt32; ... end; PProgramSettings = ^TProgramSettings; var MyProgramSettings: TProgramSettings; begin MyProgramSettings := TProgramSettings.Create; MyProgramSettings.Flag

假设我有一个名为TProgramSettings的类,它如下所示:

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

PProgramSettings = ^TProgramSettings;
var
  MyProgramSettings: TProgramSettings;
begin
  MyProgramSettings := TProgramSettings.Create;
  MyProgramSettings.Flags := 0;
  ApplySettings(@MyProgramSettings);
procedure ApplySettings(ProgramSettings: PProgramSettings);
var
  MyObject : TCustomObject;
begin
  MyObject := TCustomObject.Create;
  MyObject.Settings.Flags := ProgramSettings^.Flags;
  ...
end;
所以我像这样初始化我的程序:

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

PProgramSettings = ^TProgramSettings;
var
  MyProgramSettings: TProgramSettings;
begin
  MyProgramSettings := TProgramSettings.Create;
  MyProgramSettings.Flags := 0;
  ApplySettings(@MyProgramSettings);
procedure ApplySettings(ProgramSettings: PProgramSettings);
var
  MyObject : TCustomObject;
begin
  MyObject := TCustomObject.Create;
  MyObject.Settings.Flags := ProgramSettings^.Flags;
  ...
end;
ApplySettings的过程如下所示:

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

PProgramSettings = ^TProgramSettings;
var
  MyProgramSettings: TProgramSettings;
begin
  MyProgramSettings := TProgramSettings.Create;
  MyProgramSettings.Flags := 0;
  ApplySettings(@MyProgramSettings);
procedure ApplySettings(ProgramSettings: PProgramSettings);
var
  MyObject : TCustomObject;
begin
  MyObject := TCustomObject.Create;
  MyObject.Settings.Flags := ProgramSettings^.Flags;
  ...
end;

现在我的代码看起来像这样,但是我想知道是否有更好的方法来实现它?我是否违反了对象Pascal/Delphi代码约定?只做一个记录会更好吗?我真的不明白记录和类之间的区别,我只知道类必须初始化。如果我将TProgramSettings作为我所读内容的记录,我不应该向它传递指针,因为该记录指向内存中的同一地址,并且不需要像类那样引用。我该怎么做呢?欢迎提供任何帮助:)

类类型的对象已经是指针,因此确实不需要像您这样取消对它的引用。等价物是

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


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

类类型的对象已经是指针了,所以确实不需要像您这样取消引用它。等价物是

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


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

类实例变量是指针。因此,您需要删除指针声明并传递MyProgramSettings本身。有关传递引用的信息,请参见参数。阅读文档以更好地理解和。^^^^^^^^^^^^^^^^^此外,您是否认为
ApplySettings
可能只是类的一种方法?请确保在使用完类实例后释放它。类实例变量是指针。因此,您需要删除指针声明并传递MyProgramSettings本身。有关传递引用的信息,请参见参数。阅读文档以更好地理解和。^^^^^^^^^^^^^^^^^^^^^此外,您是否考虑过
ApplySettings
可能只是类的一种方法?请确保在使用完类实例后释放它。好的,让我试着理解它,类只是指向类型的指针。类的实例只是指向内存中包含所有信息的某个空间的指针。另一方面,记录就像一个“全局变量”,它包含其中的所有信息,因此它应该作为指针传递。这是对的吗?这不是关于类是什么。关键是Delphi的Object Pascal语法允许您透明地绕过对实例指针的解引用。只需编写f.i.
MyClass.DoSomething
@Gerard:no,TProgramSettings类型的变量只是指向类实例的指针。文档中有更多内容,这里有更多内容:不,记录不是全局变量。记录和类一样,只是一种复合类型。它们之间的关键区别在于类是引用类型,记录是值类型。因此,赋值运算符的行为不同。阅读文档或者初学者的书。你这么做很重要。@Jerry你的来源是什么?声明声明某物的存在,定义就是声明它是什么。好吧,让我试着理解它,类只是指向类型的指针。类的实例只是指向内存中包含所有信息的某个空间的指针。另一方面,记录就像一个“全局变量”,它包含其中的所有信息,因此它应该作为指针传递。这是对的吗?这不是关于类是什么。关键是Delphi的Object Pascal语法允许您透明地绕过对实例指针的解引用。只需编写f.i.
MyClass.DoSomething
@Gerard:no,TProgramSettings类型的变量只是指向类实例的指针。文档中有更多内容,这里有更多内容:不,记录不是全局变量。记录和类一样,只是一种复合类型。它们之间的关键区别在于类是引用类型,记录是值类型。因此,赋值运算符的行为不同。阅读文档或者初学者的书。你这么做很重要。@Jerry你的来源是什么?声明某事物的存在,定义是声明它是什么的行为。