是否有编译时标志来防止从StringList访问对象而不使用"对象"

M S*_*kel 0 delphi

我无法计算我错误地做了多少次:

for  i := 0 to MyList.count-1 do begin
  myobject := TMyObject(MyList[i])
  .......
end;
Run Code Online (Sandbox Code Playgroud)

什么时候应该这样:

for  i := 0 to MyList.count-1 do begin
  myobject := TMyObject(MyList.objects[i])
  .......
end;
Run Code Online (Sandbox Code Playgroud)

请注意第二段代码中的对象.

错误的代码片段将运行,并且当我尝试使用myobject时,显然会抛出访问冲突.但是,我做错了并不总是很明显.

是否有编译器选项可以防止这种情况发生?

Dan*_*rić 7

Delphi有两种方法可以TObject(var)使用As运算符进行类型转换,硬件使用和软件广播.As除非您100%确定,否则始终使用操作员是一种好习惯.在您的具体示例中

(MyList[i]) as TMyObject 不编译在哪里

(MyList.objects[i]) as TMyObject 确实.


Rob*_*edy 5

不会.编译器假设您在键入时表示您知道自己在做什么.它将允许几乎任何类型转换,其中两种类型具有相同的大小,除了在整数和浮点类型之间进行转换之外.

对于这个特定的例子,尝试让自己养成使用as运算符的习惯.然后,当您忘记使用该Objects属性时,编译器将捕获您:

myobject := MyList[i] as TMyObject; // compiler error
myobject := MyList.Objects[i] as TMyObject; // OK
Run Code Online (Sandbox Code Playgroud)

  • @M Schenkel - 你的分钟错了.;) (2认同)