Delphi:类中的记录

jpf*_*ius 3 delphi records delphi-2007 delphi-2010

以下情况:

type
  TRec = record
    Member : Integer;
  end; 

  TMyClass = class
  private
    FRec : TRec;
  public
    property Rec : TRec read FRec write FRec;
  end;
Run Code Online (Sandbox Code Playgroud)

以下不起作用(左侧不能分配),这是可以的,因为它TRec是一个值类型:

MyClass.Rec.Member := 0;
Run Code Online (Sandbox Code Playgroud)

在D2007中,虽然以下内容有效:

with MyClass.Rec do
  Member := 0;
Run Code Online (Sandbox Code Playgroud)

不幸的是,它在D2010中不起作用(我认为它在D2009中也不起作用).第一个问题:为什么?故意改变了吗?或者它只是其他一些变化的副作用?D2007的解决方法只是一个"错误"吗?

第二个问题:您如何看待以下解决方法?使用安全吗?

with PRec (@MyClass.Rec)^ do
  Member := 0;
Run Code Online (Sandbox Code Playgroud)

我在这里谈论现有代码,因此必须进行的更改才能使其工作应该是最小的.

谢谢!

Uli*_*rdt 6

MyClass.Rec.Member := 0;
Run Code Online (Sandbox Code Playgroud)

不编译是设计的.事实上,两个"有" - 构造的编译是(AFAICT)仅仅是疏忽.所以两者都不 "安全使用".

两种安全解决方案是:

  1. 分配MyClass.Rec给您操作并分配回的临时记录MyClass.Rec.
  2. 公开TMyClass.Rec.Member作为自己的权利的性质.

  • 解决方法的工作原因是因为您正在攻击类型系统.类型系统试图阻止您写入属性,因为未来的更改可能意味着属性返回副本(例如getter的返回值),而不是底层字段. (2认同)