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?