Набор рефакторингов, предлагаемый ReSharper, превосходит аналогичную функциональность Visual Studio по количеству функций, удобству использования и области применения. Каждый рефакторинг анализирует весь выбранный код, к которому он применяется (в масштабе всего решения), включая языковые вставки, и использует это понимание для преобразования кода наиболее разумным способом.
Все рефакторинги ReSharper работают с кодом на C#, подавляющее большинство доступно для VB.NET, а некоторые также служат для ASP.NET, XAML и других поддерживаемых языков.
В дополнение к рефакторингам вы можете использовать контекстные действия ReSharper, которые производят менее сложные, в основном локальные, трансформации, а не настоящие рефакторинги в том понимании, как их определяет Мартин Фаулер.
Чтобы применить рефакторинг, поместите курсор в одно из положений:
После этого вызовите необходимый рефакторинг из меню Refactor или с помощью специального сочетания клавиш. Другой способ — вызвать команду Refactor This (Ctrl+Shift+R). Так вы увидите, какие рефакторинги могут быть применены для текущего положения курсора или выделения.
Этот рефакторинг позволяет изменить сигнатуру метода следующими способами:
При изменением сигнатуры ReSharper ищет все использования метода и обновляет все вызовы, реализации и переопределения метода соответствующим образом. В случае добавления новых параметров их стандартные значения, предоставляемые пользователем, подставляются во все вызовы метода. В случае переопределяющих методов первоначальный параметр, передаваемый в метод, передается в вызов метода базового класса.
Этот рефакторинг, для которого не предусмотрено диалоговое окно, преобразует метод расширения в статический метод в том же классе. Для обратного преобразования используйте рефакторинг Convert Static to Extension Method.
Этот рефакторинг преобразует статические методы в методы расширения. Для успешного преобразования статический метод должен (1) иметь хотя бы один аргумент и (2) принадлежать статическому классу. Обратное преобразование выполняется с помощью рефакторинга Convert Extension Method to Plain Static.
Этот рефакторинг предназначен для добавления какой-либо логики к интерфейсу и для случаев, когда кажется, что предпочтительно использовать класс. Рефакторинг пытается найти конфликты, например реализующие интерфейс типы, у которых уже есть базовый тип (в C#, где нет множественного наследования, это ошибка).
С помощью этого рефакторинга абстрактный класс можно преобразовать в интерфейс. Это особенно удобно, если класс должен наследовать нескольким абстрактным классам, и следовательно, необходимо преобразовать один из них в интерфейс.
С помощью этого рефакторинга вы можете создать родительский класс для любого класса и поместить в него часть методов и полей. Просто поместите курсор на объявление класса, выберите элементы для извлечения и вызовите рефакторинг. Это очень полезно для перемещения логики вверх по иерархии наследования, чтобы впоследствии поделиться ею.
Выберите выражение или локальную переменную в методе и используйте этот рефакторинг, чтобы создать новый параметр. Все места вызовов будут обновлены, чтобы отразить измененние сигнатуры, сохранив при этом логику и семантику.
Если выражение использует локальные переменные, недоступные на месте вызова, рефакторинг позволяет передавать их в качестве делегатов.
Этот рефакторинг преобразует нестатические методы в статические (Shared в VB.NET), делая this
параметром метода. После рефакторинга целевой метод будет объявлен как статический (Shared в VB.NET), а необходимые параметры будут добавлены в места его вызовов. Рефакторинг Make Method Static/Shared может быть полезен, когда вам нужно переместить нестатические методы (non-Shared в VB.NET). В этом случае Make Method Static используется в качестве подготовительного шага перед рефакторингом Make Method Non-static.
Этот рефакторинг преобразует статические методы (Shared в VB.NET) в методы экземпляра в типе выбранного параметра (т. е. перемещает метод в тип параметра и преобразует параметр в this
) и соответствующим образом обновляет вызовы метода.
Используя этот рефакторинг, вы можете быстро переместить метод экземпляра из текущего типа в один из типов, указанных в параметрах метода.
Данный рефакторинг перемещает статические поля и методы в другой тип. Если вам нужно переместить нестатические методы, используйте рефакторинг Move Instance Method.
Этот рефакторинг относится к функциональности ReSharper для интернационализации и помогает переносить локализуемые строки в файлы ресурсов. При этом явные использования строк заменяется ссылками на интерфейсные классы ресурсов.
Вы можете вызвать этот рефакторинг с помощью специального сочетания клавиш или команды Refactor This. Кроме того, в ReSharper есть инспекция, которая подвечивает строки, не помещенные в файлы ресурсов, и предлагает быстро это исправить с помощью рефакторинга Move String to Resource. Узнайте, как настроить такую инспекцию, в документации.
Этот рефакторинг помогает перемещать члены типа в родительский класс класс или интерфейс. Такая операция полезна для обобщения поведения. ReSharper анализирует все члены в текущем классе и составляет список членов, которые можно переместить вверх по иерархии. Перед завершением рефакторинга ReSharper проверит наличие возможных конфликтов: например, будут ли элементы, которые вы пытаетесь переместить в родительский класс, доступны в целевом типе. Для обратного преобразования используйте рефакторинг Push Members Down.
Этот рефакторинг помогает упорядочить иерархию типов, переместив члены типа в подтип. Такая операция полезна для конкретизации поведения. ReSharper анализирует все члены выбранного типа и составляет список элементов, которые можно переместить вниз по иерархии. Перед завершением рефакторинга ReSharper проверит наличие возможных конфликтов: например, будут ли элементы, которые вы пытаетесь переместить, доступны в целевом типе. Для обратного преобразования предусмотрен рефакторинг Pull Members Up.
Когда вы добавляете в метод новый параметр — используя быстрое исправление или рефакторинг Change Signature — ReSharper не только обновит сигнатуру и все использования метода, но и проанализирует цепочку вызовов, к которой относится метод, что позволит «вытащить» новый параметр в любом месте внутри этой цепочки.
Рефакторинг Rename позволяет переименовывать любые символы, включая пространства имен, типы, методы, параметры, локальные переменные, свойства, события и поля. ReSharper автоматически найдет и обновит все ссылки на переименованный символ. Рефакторинг Rename можно вызвать прямо в редакторе, а иногда из других представлений (Class View, Object Browser).
Rename работает для всех поддерживаемых языков и технологий, включая C#, VB.NET, ASP.NET, XML, XAML, а также для билд-скриптов.
При использовании этого рефакторинга автоматическое обновление ссылок полностью распространяется на разметку XAML. Кроме того, можно легко переименовать специализированные символы XAML, такие как псевдонимы пространств имен и ресурсы.
Если вы переименовываете свойство или таргет в билд-скрипте, ReSharper автоматически обновит все необходимые ссылки и даже использования в комментариях и строках.
С помощью этого рефакторинга вы можете создать новый класс или структуру, а параметры выбранного метода будут преобразованы в инкапсулированные поля создаваемого типа. Использования параметров преобразуются в использования свойств созданного типа.
Это позволяет избавиться от параметров out
: для методов void один или несколько параметров out
преобразуются в возвращаемое значение, в котором при необходимости используется кортеж; а для non-void методов их можно комбинировать с существующим возвращаемым значением — опять же, используя кортеж.
Рефакторинг Transform Parameters заменяет два других: Transform Out Parameters и Extract Class from Parameters.
Этот рефакторинг инкапсулирует конструктор в статическом методе, который возвращает новый экземпляр класса.
Паттерн Factory Method — это способ создания объектов без указания точного класса создаваемого объекта. Для создания объектов ReSharper генерирует отдельный метод. Подклассы могут переопределять его, указывая производный тип создаваемого объекта.
Этот рефакторинг приводит код к общему виду, заменяя использования конкретных типов ссылками на базовый тип или интерфейс везде, где это возможно, т. е. в случаях, когда никакие члены производного типа не используются. Это особенно удобно после рефакторинга Pull Members Up.
Создание копии типа с другим именем или в другом пространстве имен занимает пару секунд. ReSharper сам создаст для нее отдельный файл. В случае частичных представлений типов копируются все части, даже если они расположены в отдельных файлах.
Этот рефакторинг преобразует анонимные типы в именованные типы в области действия либо текущего метода (локально), либо всего решения (глобально). В диалоговом окне этого рефакторинга можно указать, требуется ли сгенерировать автосвойства или свойства с резервными полями, а также включить или выключить генерацию переопределяющих методов равенства и форматирования.
Этот рефакторинг очень похож на рефакторинг Convert Property to Method, однако применяется к индексаторам (свойства по умолчанию в VB.NET). В метод можно преобразовать только геттеры, только сеттеры или и геттеры, и сеттеры. Обратная функциональность предоставляется рефакторингом Convert Method to Indexer.
Этот рефакторинг является обратным по отношению к рефакторингу Convert Indexer to Method. Он работает в бездиалоговом режиме, однако чтобы сгенерировать в индексаторе как геттер, так и сеттер, может потребоваться применить рефакторинг к двум методам.
Этот рефакторинг позволяет преобразовывать методы без параметров, возвращающие значение, в свойства с доступом для чтения, а методы со строго одним параметром, не возвращающие значение, — в свойства с доступом для записи. Парные методы можно преобразовать в единое свойство с доступом для чтения и записи.
Этот рефакторинг позволяет преобразовывать свойства с закрытыми резервными полями в свойства с автоматической реализацией (также называемые автосвойствами). Рефакторинг убирает резервное поле и заменяет все его использования созданным автосвойством.
С помощью этого рефакторинга свойства с доступом для чтения можно преобразовать в методы-геттеры (возвращающие значение методы без параметров), а свойства с доступом для записи можно преобразовать в методы-сеттеры (не возвращающие значение методы со строго одним параметром). Что касается свойств с доступом для чтения и записи, их можно преобразовать в пару методов — геттер и сеттер.
В вашем коде есть класс, выполняющий работу, которую на самом деле должны выполнять два разных класса? С помощью этого рефакторинга можно выполнить декомпозицию составного класса на два класса, у каждого из которых единственное назначение. Рефакторинг Extract Class помогает выбрать методы и поля, которые необходимо перенести из старого класса в новый. Он предупреждает обо всех нарушенных зависимостях и проблемах с доступностью и предлагает варианты устранения конфликтов.
Этот рефакторинг позволяет создавать интерфейс из класса и преобразовывать этот класс так, чтобы он реализовывал созданный интерфейс. Можно выбрать члены, извлекаемые в интерфейс, и указать имя для этого интерфейса.
Выделите блок кода и вызовите рефакторинг Extract Method, чтобы преобразовать его в метод (Sub или Function в VB.NET). ReSharper автоматически проанализирует код, чтобы определить возвращаемое значение и/или параметры out/ref.
Выберите выражение или локальную переменную и примените этот рефакторинг. Он создает новое поле или константу и инициализирует выражением или инициализатором локальной переменной. Поле можно присваивать в его инициализаторе, конструкторах типов или текущих членах.
Если у поля есть единственное использование для записи, этот рефакторинг заменяет все использования поля для чтения его выражением инициализации и удаляет объявление поля и его использование для записи.
Рефакторинг Encapsulate Field (инкапсулировать поле) позволяет быстро создать из существующего поля свойство доступа. Использования поля автоматически заменяются использованиями свойства. Очевидное преимущество этого рефакторинга заключается в возможности запретить прямой доступ к полю с помощью свойств.
Везде, где это возможно, рефакторинг переносит тело метода в тело вызывающих его методов и убирает этот метод полностью. Обратная функциональность обеспечивается рефакторингом Extract Method.
Выберите произвольное выражение внутри кода члена и вызовите рефакторинг Introduce Variable. Объявляется новая локальная переменная с явным или неявным типом, которая затем инициируется выбранным выражением. Первоначальное выражение заменяется именем переменной. Если первоначальное выражение встречается в коде несколько раз, предлагается заменить их все созданной переменной. Таким же образом можно ввести константы для константных выражений.
Этот рефакторинг позволяет переместить параметр метода в его тело. Например, если все вызовы метода передают в него одно и то же постоянное значение, этот параметр можно убрать и добавить соответствующую локальную переменную в тело метода.
Выберите произвольную переменную или локальную константу и вызовите рефакторинг «Inline Variable». Все случаи использования выбранной переменной в коде заменяются ее инициализатором. Обратная функциональность предоставляется рефакторингом Introduce Variable.
Этот рефакторинг позволяет быстро переместить часть строки в отдельную переменную. В зависимости от целевой версии C# рефакторинг либо применяет интерполяцию строк, либо обертывает строку в String.Format()
.
Этот рефакторинг может применяться к отдельному файлу или к выборке файлов, в каждом из которых несколько типов. ReSharper создает для каждого из этих типов отдельные файлы и перемещает их туда.
Рефакторинг «Move Types into Matching Files» — незаменимый помощник для тех, кто предпочитает сначала использовать типы, а затем объявлять их с помощью функциональности ReSharper Create from Usage.
Для этого рефакторинга предусмотрено сочетание клавиш, которым можно воспользоваться после нажатия Alt+Enter на имени класса, который не соответствует имени файла, в котором он находится.
С помощью этого рефакторинга вы можете переместить класс, файл или несколько выбранных классов и файлов в другой проект или папку. При выполнении перемещения ReSharper обновит необходимые директивы. Если нужно, ReSharper переименует пространства имен в соответствии с новым местоположением и распределит перемещаемые классы по отдельным файлам.
Этот рефакторинг выносит внутренний тип на более высокий уровень. В случае, если внутренний тип использует члены внешнего типа, ссылка на внешний тип передается как аргумент в конструкторы вынесенного типа. Доступ к этому рефакторингу можно получить с помощью команды рефакторинга Move.
Вы можете легко перемещать типы между пространствами имен, ReSharper автоматически обновит необходимые ссылки. Тип также можно переместить во внешнюю или вложенную область или в другой файл.
Используя этот рефакторинг, можно быстро переместить код, реализующий данный тип, в отдельный файл. Доступ к этому рефакторингу можно получить с помощью команды рефакторинга Move.
Если используется XAML, то при перемещении класса .NET в другое пространство имен обновляются ссылки на разметку XAML и соответствующим образом вставляются или изменяются директивы импорта XAML. Этот рефакторинг также можно вызывать для любой ссылки на тип непосредственно из разметки XAML.
Если вам нужно удалить тип, член типа или любой другой символ в файлах на C# или VB.NET, в коде и разметке ASP.NET, в билд-скриптах или XAML-коде, используйте этот рефакторинг, чтобы операция удаления прошла безопасно. Если ReSharper не найдет ни одного использования символа или если найденные использования можно безопасно свернуть, символ будет удален. В противном случае ReSharper покажет все использования, которые нельзя безопасно удалить, чтобы вы смогли отредактировать соответствующий код.
Этот рефакторинг может применяться к нескольким выбранным файлам или символам в текущем файле, что позволяет безопасно удалять целые подсистемы.
При вызове Safe Delete для таргета или свойства в файле сборки ReSharper выполнит все необходимые проверки и операции, чтобы удалить выбранный символ. ReSharper также может автоматически удалять все конфликтующие ссылки.
Этот рефакторинг помогает вам быстро перемещать члены типа между разными частями типа разделяемых классов. В зависимости от выбора пользователя рефакторинг использует новые части типа или создает новые.
Вы даже можете вызвать этот рефакторинг для блока #region
, чтобы переместить все члены блока в новый файл с именем, выведенным из имени блока.
Все сочетания клавиш, приведенные на этой странице, соответствуют набору сочетаний «Visual Studio», использующемуся в ReSharper по умолчанию. Подробнее о двух наборах сочетаний клавиш, доступных в ReSharper, вы можете узнать в его документации.