Должен ли я объявить переменные как можно ближе к области, где они будут использоваться? - PullRequest
6 голосов
/ 26 мая 2011

ReSharper обычно подсказывает мне это, и я все еще ищу вескую причину, почему это сделать.

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

С этим связано следующее:

int temp;
foreach (var x in collection) { 
    temp = x.GetValue();
    //Do something with temp
}

Действительно ли это отличается от

foreach (var x in collection) {
    int temp = x.GetValue();
    //...
}

Я имею в виду, не является ли второй код более дорогим, потому что он выделяет память каждый раз?Или оба одинаковы?Конечно, после завершения цикла во втором коде сборщик мусора позаботится о переменной temp, но не о первой ...

Ответы [ 7 ]

6 голосов
/ 26 мая 2011

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

Это также преимущество рефакторинга. Объявление ближе к источнику приводит к более легкому рефакторингу позже.

5 голосов
/ 26 мая 2011

Стоимость второго примера незначительна. Единственное отличие состоит в том, что в первом примере temp будет доступен вне области действия цикла for, и, следовательно, он будет существовать дольше, чем если бы вы объявили его внутри цикла for.

Если вам не нужно temp вне цикла for, его не следует объявлять вне этого цикла. Как уже говорили другие, здесь удобнее читаемость и стиль, чем производительность и память.

4 голосов
/ 26 мая 2011

Я согласен с тем, что если вы инициируете переменную внутри используемой области действия, вы помогаете команде, но я думаю, что настоящая причина - это не только лучшие практики обслуживания кода. Это своего рода способ снижения когнитивной нагрузки на вас или другого разработчика, возвращающегося к коду после нескольких месяцев (или лет) отсутствия просмотра конкретного блока. Конечно, IDE помогает вам что-то находить, но вам все равно придется танцевать «перейти к определению».

1 голос
/ 26 мая 2011

Различие заключается в стиле кодирования и одном из таких разногласий, что разные стандарты кодирования имеют совершенно противоположные правила. Конфликт по-прежнему является самым сильным в мире C ++, где язык C вынуждает объявлять переменные в начале области, и поэтому старожилы (как и я) хорошо привыкли «искать начало функции» для поиска переменных.

Стиль C #, который вы чаще всего видите, состоит в том, что переменные возникают именно в том месте, где они необходимы. Этот стиль ограничивает существование переменной и сводит к минимуму вероятность того, что вы могли случайно указать другую переменную. Мне очень легко читать.

В современную эру C # объявление переменных в их первой точке использования наиболее очевидно выгодно в сочетании с любимой и ненавистной функцией var. Использование var просто не очень полезно , если вы не используете его с присваиванием, которое позволяет компилятору и читателям определять тип переменной. Функция var поддерживает объявление при первом использовании.

Я, я люблю var, и поэтому вы можете угадать, какой стиль кодирования я предпочитаю!

1 голос
/ 26 мая 2011

Это стиль личных предпочтений, связанных с удобочитаемостью.

Очень мало языков / систем, где это может оказать какое-либо заметное влияние на производительность.

Я стараюсь следовать этим двум правилам.

Все основные атрибуты класса должны быть определены вместе в одном месте.Например, если вы обрабатываете заказ, то orderno, customerno, сумма, налог с продаж и т. д. должны быть определены близко друг к другу.

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

Или поместить все данные другого бизнес / внешнего типа, все они определены в одном месте, технические / внутренние данные определены близко к использованию.

1 голос
/ 26 мая 2011

Я полагаю, что выигрышей в производительности нет, а скорее стиль кодирования.Это больше стиль программирования C, чтобы объявить все это в начале области.Здесь есть более подробная информация: Область применения переменных в C #

0 голосов
/ 26 мая 2011

Меня всегда учили объявлять переменные в начале функции, класса и т. Д. Это облегчает чтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...