Очень часто разработчику приходится брать переменную из метода и делать ее параметром метода. Например, вы можете найти внутри метода значение и присвоить это значение локальной переменной. Вместо того чтобы делать поиск внутри метода, вы могли бы передать это значение в метод (вы могли бы использовать операцию рефакторинга "извлечение метода" для того, чтобы выделить присваивание значения в новый метод).
Такая трансформация локальной переменной в параметр может быть выполнена автоматически при помощи операции рефакторинга Promote Local Variable to Parameter. Она позволяет выбрать локальный член данного метода и ввести его в состав параметров данного метода. Инструмент рефакторинга обновляет также и все вызовы метода.
Вы вызываете операцию рефакторинга при помощи установки вашего курсора на ту строку кода, которая объявляет переменную. Затем вы выбираете в меню Refactor пункт меню Promote Local Variable to Parameter. Вы можете также получить доступ к этой операции через контекстное меню (щелчок правой кнопкой мыши).
Совет
Для вызова с клавиатуры операции рефакторинга Promote Local Variable to Parameter сначала установите ваш курсор на ту строку кода, которая содержит объявление переменной. Затем сыграйте клавиатурный аккорд <Ctrl>+<R>, <Ctrl>+<P>.
Примечание
Вы можете превращать в параметры локальные переменные только там, где они инициализируются. Иначе операция выдаст ошибку, поскольку она не знает, как обновить вызовы метода. Фактически если объявление и инициализация находятся в разных строках кода, то вы не можете использовать данную операцию рефакторинга. Этот метод рефакторинга лучше всего работает тогда, когда объявление и инициализация (присваивание) делаются в одной строке.
Давайте проработаем пример. Предположим, что у вас есть метод, который принимает идентификатор заказа и возвращает объект Order, как в следующей сигнатуре метода:
public static Order GetCustomerOrder(int orderld)
При просмотре этого метода вы замечаете, что там имеется присваивание переменной, которое получает идентификатор клиента следующим образом:
int customerld = GetCustomerld(orderld);
Предположим, вы установили, что поиск идентификатора клиента по идентификатору заказа очень неэффективен по двум причинам. Во-первых, вы должны знать идентификатор клиента еще до вызова метода. Во-вторых, вы хотите искать заказ внутри этого метода. Когда вы ищете идентификатор клиента в заказе, то ищете заказ два раза. Поэтому вы идентифицируете это присваивание переменной как хороший вариант для продвижения в сигнатуру метода. Для этого вы должны сначала щелкнуть правой кнопкой мыши по той строке кода, в которой выполняется присваивание, а затем выбрать в контекстном меню Refactor пункт Promote Local Variable to Parameter.
В данном случае предварительного просмотра изменений нет. Вместо этого Visual Studio делает рефакторинг. Присваивание из метода удаляется. Сигнатура метода изменяется следующим образом:
public static Order GetCustomerOrder(int orderld, int customerld)
Кроме того, вызовы этого метода также обновляются. В данном случае вызов GetCustomerOrder будет теперь содержать код, который ранее выполнял присваивание переменной — GetCustomerld (orderld). Вот пример:
Order newOrder = Customer.GetCustomerOrder(odrld, GetCustomerld(orderld));
Здесь есть один недостаток — код данного примера определил переменную идентификатора заказа с именем odrld (см. предыдущую строку кода). Рефакторинг использовал код присваивания переменной, в котором идентификатор заказа был orderld. Это приведет к ошибке компиляции, которую вам придется исправлять вручную, поскольку у вас теперь есть переменная orderld, которую вы не объявляли. Конечно, этого не случится с константами или в тех случаях, когда для обозначения одних и тех же вещей вы используете в разных методах согласованные имена.