2015-05-15 1 views
1

всего лишь короткий вопрос относительно использования TThreadList. Безопасно ли использовать его с «с» заявление следующим образом:TThreadList и оператор «с»

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; 

Спасибо!

+4

Я никогда не видел случай, когда краткость с стоит риск загрязнения сфера –

+2

В 2 варианта одинаково (не) сейф ... Поддерживаемость кода заключается не в написании минималистского «кода-гольфа». Речь идет о том, чтобы сделать код максимально понятным и недвусмысленным. В этом отношении использование ** с ** вообще вводит перекрытие по охвату. Для этого требуется больше усилий программиста, чтобы точно определить, где привязан каждый идентификатор внутри блока. И поэтому «безопасность» при точной интерпретации и модификации кода уменьшается. –

+1

Если вы не используете, у вас нет проблемы, верно? Используйте второй пример - это более понятный и понятный. –

ответ

2

Это на вас какой вариант вы выбираете. with только сообщает компилятору, где получает членов, которые вы пишете в своем коде. Так что да, это безопасно, пока вы обращаетесь к членам, которых хотели. Это не влияет на время выполнения.

Я предпочел бы первый путь, только без этого begin..end блока (если я был бы вынужден использовать with), но это только мое личное предпочтение, и вы можете написать его, как вы хотите:

with FEngineList.DAQEngines.LockList do 
try 
    ... 
finally 
    FEngineList.DAQEngines.UnlockList; 
end; 
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; 

Похожие: Is Delphi "with" keyword a bad practice?

+0

Я знаком с ключевыми словами «С». Однако мой случай довольно прост и прост, так что это не должно быть проблемой. Мне всегда нравится слышать плюсы и минусы от разных программистов, поэтому я могу создать свое объективное мнение (насколько это возможно). Благодаря! – Nix

+1

Неважно, насколько прост в вашем случае, 'with' не дает достаточных преимуществ, чтобы перевесить риск. –

+0

Я вижу. Согласно моему делу, я могу легко избавиться от «с». – Nix

Смежные вопросы