TThreadList 和 "with" 语句
TThreadList and "with" statement
只是一个关于如何使用 TThreadList 的简短问题。将它与 "with" 语句一起使用是否安全,如下所示:
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;
谢谢!
选择哪种变体取决于您。 with
仅 告诉 编译器在何处 获取 您在代码中编写的成员。所以是的,它是安全的,只要您正在访问您想要访问的成员。它不影响运行时间。
我更喜欢第一种方式,只是没有那个 begin..end
块(如果我 被迫 使用 with
),但它只是个人喜好,大家可以随意写:
with FEngineList.DAQEngines.LockList do
try
...
finally
FEngineList.DAQEngines.UnlockList;
end;
不推荐这两种变体。如果您必须在这两者之间进行选择,则前者更可取,因为实际上不需要额外的局部变量。
但是,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;
相关:Is Delphi "with" keyword a bad practice?
只是一个关于如何使用 TThreadList 的简短问题。将它与 "with" 语句一起使用是否安全,如下所示:
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;
谢谢!
选择哪种变体取决于您。 with
仅 告诉 编译器在何处 获取 您在代码中编写的成员。所以是的,它是安全的,只要您正在访问您想要访问的成员。它不影响运行时间。
我更喜欢第一种方式,只是没有那个 begin..end
块(如果我 被迫 使用 with
),但它只是个人喜好,大家可以随意写:
with FEngineList.DAQEngines.LockList do
try
...
finally
FEngineList.DAQEngines.UnlockList;
end;
不推荐这两种变体。如果您必须在这两者之间进行选择,则前者更可取,因为实际上不需要额外的局部变量。
但是,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;
相关:Is Delphi "with" keyword a bad practice?