Должен ли я объявлять переменные как можно ближе к области, в которой они будут использоваться?

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();
}

Итак, теперь лучший вариант лучше?