Должен ли я объявлять переменные как можно ближе к области, в которой они будут использоваться?
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
, но не в первом...
Ответы
Ответ 1
Стоимость второго примера пренебрежимо мала. Единственное отличие состоит в том, что в первом примере temp
будет доступен за пределами цикла for
, и, следовательно, он будет существовать дольше, чем если бы вы объявили его внутри цикла for
.
Если вам не нужен temp
вне цикла for
, он не должен быть объявлен вне этого цикла. Как говорили другие, читаемость и стиль играют более важную роль, чем производительность и память.
Ответ 2
Объявление максимально приближенного к использованию является решением для чтения. Ваш пример не отображает его, но в более длинных методах трудно просеять код, чтобы найти временную переменную.
Это также преимущество рефакторинга. Объявление ближе к источнику приводит к более легкому рефакторингу позже.
Ответ 3
Я согласен, что если вы запустите переменную внутри области, в которой она используется, вы помогаете gc, но я думаю, что настоящая причина больше связана с лучшими практиками обслуживания кода. Это своего рода способ уменьшить когнитивную нагрузку на вас или другого разработчика, возвращаясь к коду после нескольких месяцев (или лет), не глядя на конкретный блок. Несомненно, IDE поможет вам разобраться в вещах, но вам все равно придется заниматься танцами "пойти в определение".
Ответ 4
Полагаю, никаких преимуществ в производительности, но больше стиля кодирования. Его более C-стиль программирования, чтобы объявить все это в начале области. Здесь более подробно: Объем переменных в С#
Ответ 5
Своей личным предпочтением для стиля является читаемость.
Существует очень мало языков/систем, где это окажет заметное влияние на производительность.
Я пытаюсь выполнить эти два правила.
Все основные атрибуты класса должны быть определены вместе в одном месте. например Если вы обрабатываете заказ, тогда orderno, customerno, amount, налог с продаж и т.д. Должны быть указаны близко друг к другу.
Все технические атрибуты, которые являются частью внутренней механики класса, такие как итераторы, флаги, переменные состояния, должны быть определены близко к их использованию.
Или указать другие данные бизнеса/внешнего типа, определенные в одном месте, технические/внутренние данные, определенные близко к использованию.
Ответ 6
Разница заключается в стиле кодирования и одном из таких споров, что разные стандарты кодирования имеют совершенно противоположные правила. Конфликт все еще сильней в мире С++, где принудительные переменные языка C были объявлены в начале области действия, и поэтому старожилы (например, я) хорошо привыкли "смотреть на начало функции", чтобы найти переменные.
Стиль С#, который вы чаще всего видите, это то, что переменные появляются в том месте, где они нужны. Этот стиль ограничивает существование переменной и сводит к минимуму вероятность того, что вы можете случайно назвать любую другую переменную. Мне очень легко читать.
В современную эпоху С# размещение декларации переменных в их первой точке использования наиболее очевидно полезно в сочетании с любимой и ненавистной функцией var
. Использование var
просто не так полезно, если вы не используете его с назначением, которое позволяет компилятору и читателям выводить тип переменной. Функция var
поощряет декларирование с первого раза.
Мне, я люблю var
, и поэтому вы можете догадаться, какой стиль кодирования я предпочитаю!
Ответ 7
Мне всегда учили объявлять переменные в верхней части функции, класса и т.д. Это облегчает чтение.
Ответ 8
возможно, стоимость незначительна, потому что вы объявляете только объект int.
как насчет других ситуаций?
например, если нам понадобится использовать метод объектов, тогда как (1) это определенно будет значительным.
//first option
Class1 aa = new Class1(); //object constructor takes long time to init
while(1){
aa.doWork();
}
//or Second option:
while(1){
Class1 aa = new Class1();
aa.doWork();
}
Итак, теперь лучший вариант лучше?