ReSharper жалуется, когда метод может быть статичным, но не

Почему ReSharper жалуется, когда метод может стать статичным, но нет?

Это потому, что создается только один экземпляр статического метода (по типу) и таким образом экономит на производительности?

Я считаю, что комментарий очень полезен, поскольку он указывает на две важные вещи:

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

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

Из документации FxCop для того же предупреждения (выделено мной):

«Пользователи, которые не имеют доступа к данным экземпляра или методам вызова экземпляра, могут быть помечены как статические (Shared в Visual Basic). После того, как вы пометили методы как статические, компилятор будет выдавать не виртуальные сайты вызовов этим членам. сайты будут препятствовать проверке во время выполнения для каждого вызова, который гарантирует, что текущий указатель объекта не равен нулю. Это может привести к измеримому усилению производительности для кода, чувствительного к производительности. В некоторых случаях отказ доступа к экземпляру текущего объекта представляет собой проблема правильности “.

Здесь очень хорошие дискуссии по этому вопросу (SO) . Я в лагере if-it-can-be-made-static-make-it-static. Я верю в это из-за того, что у кого-то есть метод экземпляра, который не использует данные экземпляра. Действительно ли это метод экземпляра в этом случае или это метод classа?

Нет (нулевые) экземпляры classа необходимо создать для использования метода, если он объявлен как статический …, который экономит циклы процессора, необходимые для обработки конструкции, кучи пространства и циклов процессора сборщиком мусора в возврате объекта из куча …

Кроме того, ваш вопрос, как он писал

«… создается только один экземпляр статического метода (по типу) …»

подразумевает, что для метода экземпляра код для метода повторяется для каждого экземпляра создаваемого classа. Это неправда. Независимо от того, сколько экземпляров вы создаете для любого типа, код для методов загружается в память только один раз. Объект, хранящийся в куче для каждого экземпляра, сохраняет только «состояние» типа (нестатические поля и несколько разных переменных отслеживания).

Это не жалоба, это просто совет.

Вам не нужно нажимать «это» на стек функции для статического метода. Это еще одна причина, по которой это дешевле.

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

Другой аккуратный трюк со статикой в ​​ReSharper заключается в том, чтобы сделать набор связанных методов статичным, используя рефакторинг «Сделать метод Static». Это переместит некоторые из зависимостей в параметры метода. Когда вы посмотрите на этот набор методов позже, вы можете обнаружить, что все они получают доступ к определенному объекту определенного типа. Затем вы можете использовать рефакторинг «Сделать метод нестатического» и указать этот объект как новый этот указатель. Это переводит ваш метод в другой class.

Из этого:

internal class ClassA { public ClassB Property { get; set; } public int Method() { var classB = Property; return classB.Property1 + classB.Property2; } } internal class ClassB { public int Property1 { get; set; } public int Property2 { get; set; } } 

к этому:

  public static int Method(ClassB property) { var classB = property; return classB.Property1 + classB.Property2; } 

к этому:

 internal class ClassA { public ClassB Property { get; set; } } internal class ClassB { public int Property1 { get; set; } public int Property2 { get; set; } public int Method() { return Property1 + Property2; } } 

Статический экземпляр создается при первом использовании и останется в памяти. Если он больше не будет использоваться, это может быть проблемой. Статические испытания сложнее (мок и т. Д.).

Interesting Posts

Windows 10 Explorer отключает имя папки после символа последнего периода

Регулярное выражение для соответствия действительным датам

Разрешение общего интерфейса с Autofac

Есть ли опция «сохранить значок рабочего стола» в окнах?

BroadcastReceiver при изменении состояния сети Wi-Fi или 3g

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

Есть ли проблемы с огромными папками?

доступ к файлам с пробелами в имени файла из java

Как получить доступ к элементам из XML-fragmentа по идентификатору

Каков самый простой способ генерации xml в c ++?

Как получить необработанные данные предварительного просмотра из объекта Camera не менее 15 кадров в секунду в Android?

Привязка данных Android с использованием тега include

Шаблон дизайна для Undo Engine

Как назначение сигнала работает в процессе?

.NET / C # – преобразовать char в строку

Давайте будем гением компьютера.