关于如何使用TThreadList的简短问题。与"和#34;一起使用是否安全?声明如下:
with FEngineList.DAQEngines.LockList do
begin
try
for Idx := 0 to Count - 1 do
Items[idx].Param1 := cos(2*pi*I/Count);
...
...
finally
FEngineList.DAQEngines.UnlockList;
end;
end;
或者我应该像这里一样明确地这样做:
uEngines := FEngineList.DAQEngines.LockList;
try
with uEngines do
begin
for Idx := 0 to Count - 1 do
Items[idx].Param1 := cos(2*pi*I/Count);
...
...
end;
finally
FEngineList.DAQEngines.UnlockList;
end;
谢谢!
答案 0 :(得分:2)
您可以选择哪种变体。 with
只有告诉编译器在您的代码中获取成员的位置。所以,是的,只要您正在访问您想要的成员,它就是安全的。它不会影响运行时。
我更喜欢第一种方式,只是没有begin..end
阻止(如果我强制使用with
),但它是只是我个人的偏好,你可以随心所欲地写出来:
with FEngineList.DAQEngines.LockList do
try
...
finally
FEngineList.DAQEngines.UnlockList;
end;
答案 1 :(得分:2)
不建议使用任何变体。如果你必须在这两者之间做出选择,那么前者是更好的,因为不需要额外的局部变量。
但是,应避免使用with
。问题在于引入了范围重叠的可能性。如果原始范围和作为with
主题的对象具有相同名称的成员,则with
范围会隐藏外部范围。当您将新成员添加到恰好与外部作用域成员同名的with
主题时,这会引发您的注意。充其量你的程序将无法编译。在最坏的情况下,它编译,你有一个缺陷。很可能是你不容易发现的缺陷。
像这样编码:
uEngines := FEngineList.DAQEngines.LockList;
try
for Idx := 0 to uEngines.Count - 1 do
uEngines.[Idx].Param1 := Cos(2*pi*Idx/uEngines.Count);
....
end;
finally
FEngineList.DAQEngines.UnlockList;
end;