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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Также, ваш вопрос, как он писал

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Из этого:

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;
    }
}

Ответ 8

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