看起来Delphi编译器不支持 const 记录参数 涉及“方法记录”。
之前没有尝试滥用 const 约定,我有点意外 找到编译器接受的代码:
type
TTest = record
Field : String;
procedure Update;
end;
procedure TTest.Update;
begin
Field := Field + '+1';
end;
procedure DoStuff(const t : TTest);
begin
ShowMessage(t.Field);
t.Update;
ShowMessage(t.Field);
end;
如果你试图做一个
在 DoStuff f.i中的t.Field:='doh';
,编译器会正确地抱怨,但是你可以调用修改“const”记录的方法,甚至没有提示或警告。因此,这与引用类型(例如类或动态数组)不同,其中允许直接字段写入(因为const仅限制对参数本身的更改)。
附录:这允许以这种方式修改声明的编译时常量,如:
const
cTest : TTest = (Field : '1');
...
cTest.Update; // will show '1' then '1'+'1'
ShowMessage(cTest.Field); // will show '1' (because optimized at compile-time)
这是接受/记录的行为吗?或者仅仅是编译器的缺点?
答案 0 :(得分:15)
const
从不对Delphi中的方法调用施加任何限制,无论是记录还是类实例。所以我认为与方法调用的处理方法没有任何不一致。
如果无法在作为const
参数传递的记录上调用方法,那么这几乎会使用方法渲染的记录无效。例如,这意味着无法调用属性getter。为了对作为const
传递的记录进行限制,需要有一个与C ++的const成员函数相同的概念。这将允许编译器知道某些方法是非变异的。
答案 1 :(得分:4)
该对象的好处是,可以将此类方法声明为私有,这使您可以保护其数据。您甚至可以创建一个继承的类,即可以隐藏改变其数据的所有可能性。也许你想尝试这种方法?