在Delphi中记录方法和const参数

Eri*_*nge 12 delphi methods record

当涉及"涉及方法的记录"时,看起来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;
Run Code Online (Sandbox Code Playgroud)

虽然如果你尝试t.Field:='doh';DoStuff中执行操作 ,编译器会正确地抱怨,但是你可以调用修改"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)
Run Code Online (Sandbox Code Playgroud)

这是接受/记录的行为吗?还是仅仅是编译器的缺点?

Dav*_*nan 15

const永远不会对Delphi中的方法调用施加任何限制,无论是记录还是类实例.所以我不认为与方法调用的处理有任何不一致.

如果无法在作为const参数传递的记录上调用方法,那么几乎会使用方法渲染记录无用.例如,这意味着无法调用属性getter.为了对传递给的这些记录施加限制const,需要有一个与C++的const成员函数相同的概念.这将允许编译器知道某些方法是非变异的.

  • @Warren 这就是 C++ const 成员函数所做的。 (2认同)