在Delphi中记录方法和常量参数

前端之家收集整理的这篇文章主要介绍了在Delphi中记录方法和常量参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看来Delphi编译器不符合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;

而如果你试图做一个
t.Field:= ‘DOH’;在DoStuff f.i.中,编译器会正确抱怨,但是您可以调用方法修改“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)

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

解决方法

const不会对Delphi中的方法调用造成任何限制,无论是在记录还是类的实例上.所以我不认为方法调用的处理方式不一致.

如果方法无法在作为const参数传递的记录上被调用,那么这几乎可以使方法无法使用方法.这意味着,例如,不能调用属性getter.为了对通过const的这种记录进行限制,需要对C的const成员函数有一个等同的概念.这将允许编译器知道某些方法是非突变的.

猜你在找的Delphi相关文章