Подтвердить что ты не робот

Это действительно улучшение (перемещение var во внутреннюю область, когда внутренняя область находится в цикле)?

Resharper рекомендует, чтобы эти vars:

List<string> senderDeviceIDList;
string senderDeviceID;
. . .
            foreach (var item in PlatypiIds)
            {
                senderDeviceIDList = await GetSenderDeviceIDForSenderID(item);
                senderDeviceID = senderDeviceIDList[0];

... может быть объявлен во внутренней области, например:

    foreach (var item in PlatypiIds)
    {
        List<string> senderDeviceIDList = await GetSenderDeviceIDForSenderID(item);
        string senderDeviceID = senderDeviceIDList[0];

... но действительно ли это "лучше"? Разве это не означает, что vars объявляется N раз (один раз для каждого цикла foreach)?

4b9b3361

Ответ 1

В плане производительности или распределения памяти нет любого преимущества, так как переменные внутри или вне области видимости if объявляются в IL, кстати.

Единственное преимущество - это локализация области переменных. Переместите его в область, в которой он используется, что приносит доброту:

  • простой рефакторинг (может быть самым важным)

  • читабельность

    . Если вы видите переменную внутри области видимости, вы знаете, что ее использовали только внутри этой области действия, и если вы видите какую-то переменную, которая, по-видимому, не внутри, вы знаете, что ее изменение может повлиять на другие части кода. Поэтому его изменение может привести к некоторой потенциальной опасности.

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

Ответ 2

Разве это не означает, что vars объявляется N раз (по одному для каждого цикла foreach)?

Логически, с концептуальной точки зрения да, и что точка! Логически они существуют один раз за цикл и не имеют смысла вне сферы действия цикла.

В качестве детали реализации нет, это не приведет к созданию нескольких локальных переменных. Метод будет иметь только одну переменную, и он будет повторно использоваться в общем случае (и когда это разрешено). Существуют исключительные случаи, например, когда вы закрываете переменную анонимным методом, в которой она не может повторно использовать переменную.

Обратите внимание, что поскольку С# заставляет вас инициализировать все локальные переменные перед их использованием, среда выполнения даже не отвечает за ее очистку после каждого цикла, компилятор не позволит вам повторно использовать мусор, который был ранее (если вы явно инициализируете его в начале цикла значением по умолчанию).

Ответ 3

Вы назначаете экземпляры этих объектов один раз на итерацию в любом случае, единственное, что отличается в первоначальном подходе, это то, что вы объявляете ссылки один раз, а не каждую итерацию, как во втором примере.

Если вам нужно было использовать эти объекты в конечном состоянии в конце цикла foreach (волосатый), вы можете пойти с 1-м подходом.

Ответ 4

Иногда выигрыш существует.

Если результирующий массив огромен, а затем переместите его во внутреннюю область - т.е. уменьшить объем и срок службы - может препятствовать его смещению в последующие поколения сборщиков мусора и собирать мусор с ощутимой задержкой.