Рефакторинги

Набор рефакторингов, предлагаемый ReSharper, превосходит аналогичную функциональность Visual Studio по количеству функций, удобству использования и области применения. Каждый рефакторинг анализирует весь выбранный код, к которому он применяется (в масштабе всего решения), включая языковые вставки, и использует это понимание для преобразования кода наиболее разумным способом.

Все рефакторинги ReSharper работают с кодом на C#, подавляющее большинство доступно для VB.NET, а некоторые также служат для ASP.NET, XAML и других поддерживаемых языков.

В дополнение к рефакторингам вы можете использовать контекстные действия ReSharper, которые производят менее сложные, в основном локальные, трансформации, а не настоящие рефакторинги в том понимании, как их определяет Мартин Фаулер.

Меню Refactor This для C#

Использование рефакторингов

Чтобы применить рефакторинг, поместите курсор в одно из положений:

  • на символ в редакторе,
  • на выделенный фрагмент кода в редакторе,
  • на файл или несколько выделенных файлов в окне Solution Explorer,
  • на член типа или несколько выделенных членов типов в представлении File Structure или в другом окне инструментов ReSharper.

После этого вызовите необходимый рефакторинг из меню Refactor или с помощью специального сочетания клавиш. Другой способ — вызвать команду Refactor This (Ctrl+Shift+R). Так вы увидите, какие рефакторинги могут быть применены для текущего положения курсора или выделения.

Рефакторинг Change Signature в ReSharper

Change Signature

Этот рефакторинг позволяет изменить сигнатуру метода следующими способами:

  • Добавить, удалить, переименовать параметр(ы) или изменить порядок параметров
  • Изменить тип возвращаемого значения
  • Изменить тип(ы) параметра
  • Переименовать метод

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

Рефакторинг Convert Extension Method to Static в ReSharper

Convert Extension Method to Plain Static

Этот рефакторинг, для которого не предусмотрено диалоговое окно, преобразует метод расширения в статический метод в том же классе. Для обратного преобразования используйте рефакторинг Convert Static to Extension Method.

Convert Static to Extension Method

Этот рефакторинг преобразует статические методы в методы расширения. Для успешного преобразования статический метод должен (1) иметь хотя бы один аргумент и (2) принадлежать статическому классу. Обратное преобразование выполняется с помощью рефакторинга Convert Extension Method to Plain Static.

Преобразование интерфейса в абстрактный класс с помощью рефакторинга в ReSharper

Convert Interface to Abstract Class

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

Convert Abstract Class to Interface

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

Рефакторинг Extract Superclass в ReSharper

Extract Superclass

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

Рефакторинг Introduce Parameter в ReSharper

Introduce Parameter

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

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

Make Method Static/Shared

Этот рефакторинг преобразует нестатические методы в статические (Shared в VB.NET), делая this параметром метода. После рефакторинга целевой метод будет объявлен как статический (Shared в VB.NET), а необходимые параметры будут добавлены в места его вызовов. Рефакторинг Make Method Static/Shared может быть полезен, когда вам нужно переместить нестатические методы (non-Shared в VB.NET). В этом случае Make Method Static используется в качестве подготовительного шага перед рефакторингом Make Method Non-static.

Make Method Non-Static/Non-Shared

Этот рефакторинг преобразует статические методы (Shared в VB.NET) в методы экземпляра в типе выбранного параметра (т. е. перемещает метод в тип параметра и преобразует параметр в this) и соответствующим образом обновляет вызовы метода.

Move Instance Method

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

Move Static Member

Данный рефакторинг перемещает статические поля и методы в другой тип. Если вам нужно переместить нестатические методы, используйте рефакторинг Move Instance Method.

Move String to Resource

Этот рефакторинг относится к функциональности ReSharper для интернационализации и помогает переносить локализуемые строки в файлы ресурсов. При этом явные использования строк заменяется ссылками на интерфейсные классы ресурсов.

Вы можете вызвать этот рефакторинг с помощью специального сочетания клавиш или команды Refactor This. Кроме того, в ReSharper есть инспекция, которая подвечивает строки, не помещенные в файлы ресурсов, и предлагает быстро это исправить с помощью рефакторинга Move String to Resource. Узнайте, как настроить такую инспекцию, в документации.

Pull Members Up

Этот рефакторинг помогает перемещать члены типа в родительский класс класс или интерфейс. Такая операция полезна для обобщения поведения. ReSharper анализирует все члены в текущем классе и составляет список членов, которые можно переместить вверх по иерархии. Перед завершением рефакторинга ReSharper проверит наличие возможных конфликтов: например, будут ли элементы, которые вы пытаетесь переместить в родительский класс, доступны в целевом типе. Для обратного преобразования используйте рефакторинг Push Members Down.

Push Members Down

Этот рефакторинг помогает упорядочить иерархию типов, переместив члены типа в подтип. Такая операция полезна для конкретизации поведения. ReSharper анализирует все члены выбранного типа и составляет список элементов, которые можно переместить вниз по иерархии. Перед завершением рефакторинга ReSharper проверит наличие возможных конфликтов: например, будут ли элементы, которые вы пытаетесь переместить, доступны в целевом типе. Для обратного преобразования предусмотрен рефакторинг Pull Members Up.

Рефакторинг Pull Parameter в ReSharper

Pull Parameter

Когда вы добавляете в метод новый параметр — используя быстрое исправление или рефакторинг Change Signature — ReSharper не только обновит сигнатуру и все использования метода, но и проанализирует цепочку вызовов, к которой относится метод, что позволит «вытащить» новый параметр в любом месте внутри этой цепочки.

Рефакторинг Rename в XAML

Rename

Рефакторинг Rename позволяет переименовывать любые символы, включая пространства имен, типы, методы, параметры, локальные переменные, свойства, события и поля. ReSharper автоматически найдет и обновит все ссылки на переименованный символ. Рефакторинг Rename можно вызвать прямо в редакторе, а иногда из других представлений (Class View, Object Browser).

Rename работает для всех поддерживаемых языков и технологий, включая C#, VB.NET, ASP.NET, XML, XAML, а также для билд-скриптов.

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

Если вы переименовываете свойство или таргет в билд-скрипте, ReSharper автоматически обновит все необходимые ссылки и даже использования в комментариях и строках.

Рефакторинг Transform Parameters в ReSharper

Transform Parameters

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

Это позволяет избавиться от параметров out: для методов void один или несколько параметров out преобразуются в возвращаемое значение, в котором при необходимости используется кортеж; а для non-void методов их можно комбинировать с существующим возвращаемым значением — опять же, используя кортеж.

Рефакторинг Transform Parameters заменяет два других: Transform Out Parameters и Extract Class from Parameters.

Replace Constructor with Factory Method

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

Паттерн Factory Method — это способ создания объектов без указания точного класса создаваемого объекта. Для создания объектов ReSharper генерирует отдельный метод. Подклассы могут переопределять его, указывая производный тип создаваемого объекта.

Use Base Type where Possible

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

Copy Type

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

Convert Anonymous to Named Type

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

Convert Indexer to Method

Этот рефакторинг очень похож на рефакторинг Convert Property to Method, однако применяется к индексаторам (свойства по умолчанию в VB.NET). В метод можно преобразовать только геттеры, только сеттеры или и геттеры, и сеттеры. Обратная функциональность предоставляется рефакторингом Convert Method to Indexer.

Convert Method to Indexer

Этот рефакторинг является обратным по отношению к рефакторингу Convert Indexer to Method. Он работает в бездиалоговом режиме, однако чтобы сгенерировать в индексаторе как геттер, так и сеттер, может потребоваться применить рефакторинг к двум методам.

Convert Method to Property

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

Convert Property to Auto-Property

Этот рефакторинг позволяет преобразовывать свойства с закрытыми резервными полями в свойства с автоматической реализацией (также называемые автосвойствами). Рефакторинг убирает резервное поле и заменяет все его использования созданным автосвойством.

Рефакторинг Convert Property to Method в ReSharper

Convert Property to Method

С помощью этого рефакторинга свойства с доступом для чтения можно преобразовать в методы-геттеры (возвращающие значение методы без параметров), а свойства с доступом для записи можно преобразовать в методы-сеттеры (не возвращающие значение методы со строго одним параметром). Что касается свойств с доступом для чтения и записи, их можно преобразовать в пару методов — геттер и сеттер.

Рефакторинг Extract Сlass в ReSharper

Extract Class

В вашем коде есть класс, выполняющий работу, которую на самом деле должны выполнять два разных класса? С помощью этого рефакторинга можно выполнить декомпозицию составного класса на два класса, у каждого из которых единственное назначение. Рефакторинг Extract Class помогает выбрать методы и поля, которые необходимо перенести из старого класса в новый. Он предупреждает обо всех нарушенных зависимостях и проблемах с доступностью и предлагает варианты устранения конфликтов.

Extract Interface

Этот рефакторинг позволяет создавать интерфейс из класса и преобразовывать этот класс так, чтобы он реализовывал созданный интерфейс. Можно выбрать члены, извлекаемые в интерфейс, и указать имя для этого интерфейса.

Extract Method

Выделите блок кода и вызовите рефакторинг Extract Method, чтобы преобразовать его в метод (Sub или Function в VB.NET). ReSharper автоматически проанализирует код, чтобы определить возвращаемое значение и/или параметры out/ref.

Introduce Field

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

Inline Field

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

Encapsulate Field

Рефакторинг Encapsulate Field (инкапсулировать поле) позволяет быстро создать из существующего поля свойство доступа. Использования поля автоматически заменяются использованиями свойства. Очевидное преимущество этого рефакторинга заключается в возможности запретить прямой доступ к полю с помощью свойств.

Inline Method

Везде, где это возможно, рефакторинг переносит тело метода в тело вызывающих его методов и убирает этот метод полностью. Обратная функциональность обеспечивается рефакторингом Extract Method.

Встраивание переменной с помощью рефакторинга в ReSharper

Introduce Variable

Выберите произвольное выражение внутри кода члена и вызовите рефакторинг Introduce Variable. Объявляется новая локальная переменная с явным или неявным типом, которая затем инициируется выбранным выражением. Первоначальное выражение заменяется именем переменной. Если первоначальное выражение встречается в коде несколько раз, предлагается заменить их все созданной переменной. Таким же образом можно ввести константы для константных выражений.

Inline Parameter

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

Inline Variable

Выберите произвольную переменную или локальную константу и вызовите рефакторинг «Inline Variable». Все случаи использования выбранной переменной в коде заменяются ее инициализатором. Обратная функциональность предоставляется рефакторингом Introduce Variable.

Рефакторинг Introduce Variable for Substring

Introduce Variable for Substring

Этот рефакторинг позволяет быстро переместить часть строки в отдельную переменную. В зависимости от целевой версии C# рефакторинг либо применяет интерполяцию строк, либо обертывает строку в String.Format().

Рефакторинг Move Types into Matching Files в ReSharper

Move Types into Matching Files

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

Рефакторинг «Move Types into Matching Files» — незаменимый помощник для тех, кто предпочитает сначала использовать типы, а затем объявлять их с помощью функциональности ReSharper Create from Usage.

Для этого рефакторинга предусмотрено сочетание клавиш, которым можно воспользоваться после нажатия Alt+Enter на имени класса, который не соответствует имени файла, в котором он находится.

Move to Folder

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

Move Type to Outer Scope

Этот рефакторинг выносит внутренний тип на более высокий уровень. В случае, если внутренний тип использует члены внешнего типа, ссылка на внешний тип передается как аргумент в конструкторы вынесенного типа. Доступ к этому рефакторингу можно получить с помощью команды рефакторинга Move.

Move Type to Another File or Namespace

Вы можете легко перемещать типы между пространствами имен, ReSharper автоматически обновит необходимые ссылки. Тип также можно переместить во внешнюю или вложенную область или в другой файл.
Используя этот рефакторинг, можно быстро переместить код, реализующий данный тип, в отдельный файл. Доступ к этому рефакторингу можно получить с помощью команды рефакторинга Move.

Если используется XAML, то при перемещении класса .NET в другое пространство имен обновляются ссылки на разметку XAML и соответствующим образом вставляются или изменяются директивы импорта XAML. Этот рефакторинг также можно вызывать для любой ссылки на тип непосредственно из разметки XAML.

Safe Delete

Если вам нужно удалить тип, член типа или любой другой символ в файлах на C# или VB.NET, в коде и разметке ASP.NET, в билд-скриптах или XAML-коде, используйте этот рефакторинг, чтобы операция удаления прошла безопасно. Если ReSharper не найдет ни одного использования символа или если найденные использования можно безопасно свернуть, символ будет удален. В противном случае ReSharper покажет все использования, которые нельзя безопасно удалить, чтобы вы смогли отредактировать соответствующий код.

Этот рефакторинг может применяться к нескольким выбранным файлам или символам в текущем файле, что позволяет безопасно удалять целые подсистемы.

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

Рефакторинг Extract Members to Partial

Extract Members to Partial

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

Вы даже можете вызвать этот рефакторинг для блока #region, чтобы переместить все члены блока в новый файл с именем, выведенным из имени блока.

Обратите внимание:

Все сочетания клавиш, приведенные на этой странице, соответствуют набору сочетаний «Visual Studio», использующемуся в ReSharper по умолчанию. Подробнее о двух наборах сочетаний клавиш, доступных в ReSharper, вы можете узнать в его документации.