Поделиться через


Извлечение метода

Обновлен: Ноябрь 2007

Извлечение метода — это операция оптимизации, обеспечивающая простой способ создания нового метода из фрагмента кода существующего члена. Дополнительные сведения см. в разделе Оптимизация.

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

Операция Извлечение метода позволяет получить следующие преимущества:

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

  • Способствует получению самодокументирующего кода за счет хорошей организации.

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

  • Способствует созданию сильно детализированных методов для упрощения переопределения.

  • Сокращает дублирование кода.

Заметки

При использовании команды Извлечение метода новый метод вставляется после исходного члена в тот же класс.

Разделяемые типы

Если класс является разделяемым типом, то операция Извлечение метода приводит к генерированию нового метода непосредственно после исходного члена. Операция Извлечение метода определяет сигнатуру нового метода, создавая статический метод, если в коде нового метода нет ссылок на данные экземпляра.

Параметры универсального типа

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

Анонимные методы

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

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

Следующий пример демонстрирует это изменение семантики. В случае выполнения этого кода на консоль будут выведены символы 11. При использовании операции Извлечение метода с целью извлечения отмеченного комментариями региона кода в отдельный метод и последующем исполнении полученного в результате оптимизации кода на консоль будут выведены символы 10.

class Program
{
    delegate void D();
    D d;
    static void Main(string[] args)
    {
        Program p = new Program();
        int i = 10;
        /*begin extraction*/
            p.d = delegate { Console.WriteLine(i++); };
        /*end extraction*/
        i++;
        p.d();
    }
}

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

См. также

Задачи

Практическое руководство. Оптимизация кода с помощью операции "извлечение метода"