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


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

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

8 65

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

еще один аккуратный трюк со статикой в ReSharper заключается в том, чтобы сделать набор связанных методов статическим с помощью "метода Make Статический " рефакторинг. Это приведет к перемещению некоторых зависимостей в параметры метода. Когда вы посмотрите на этот набор методов позже, вы можете обнаружить, что все они обращаются к определенному объекту определенного типа. Затем вы можете использовать рефакторинг "Make method non-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;
    }
}

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