【发布时间】:2009-12-17 08:00:47
【问题描述】:
以下情况:
type
TRec = record
Member : Integer;
end;
TMyClass = class
private
FRec : TRec;
public
property Rec : TRec read FRec write FRec;
end;
以下不起作用(无法分配左侧),这没关系,因为TRec 是一个值类型:
MyClass.Rec.Member := 0;
在 D2007 中,虽然以下方法有效:
with MyClass.Rec do
Member := 0;
不幸的是,它在 D2010 中不起作用(我认为它在 D2009 中也不起作用)。第一个问题:为什么会这样?是不是故意改的?还是只是其他一些变化的副作用? D2007 解决方法只是一个“错误”吗?
第二个问题:您如何看待以下解决方法?使用安全吗?
with PRec (@MyClass.Rec)^ do
Member := 0;
我在这里谈论的是现有代码,因此必须对其进行的更改应该是最小的。
谢谢!
【问题讨论】:
-
MyClass.Rec.Member := 0;不接受是因为 Rec 是一个属性,而不是因为它是一个值类型。直接尝试使用 Field,也是一种值类型,它可以工作:MyClass.FRec.Member := 0;
-
好吧,如果
TRec是一个类,它会工作。所以,这两个事实在这里都很重要(它是一个值类型的事实和它通过属性访问的事实) -
该变通方法使用起来并不安全。考虑未来对 Rec 属性的更改,以便它从 getter 而不是字段读取:您的 hack 将意味着它将修改一个临时的并且不会对基础字段产生影响。这就是属性不允许修改返回值类型的原因。
-
除了问题之外:不需要 with 语句,这应该以相同的方式工作:PRec(@t.Rec).Member := 0;
-
@Remko:我知道。原始代码使用
with,我希望将代码更改保持在最低限度。
标签: delphi delphi-2010 delphi-2007 records