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

Вы можете добавить еще один strtotime, чтобы получить желаемый результат

$payroll['month'] = "2019-03";
echo $payroll['month'];
echo $newdate = date("Y-m", strtotime("-1 months", strtotime($payroll['month'])));

Еще один способ сделать то же самое:

date('Y-m', strtotime($payroll['month'] . '-1 months'))

Это также будет работать для вас. [ 115]

65
задан John Saunders 28 August 2011 в 10:56
поделиться

7 ответов

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

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

102
ответ дан 24 November 2019 в 15:21
поделиться

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

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

25
ответ дан 24 November 2019 в 15:21
поделиться

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

6
ответ дан 24 November 2019 в 15:21
поделиться

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

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

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

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

5
ответ дан 24 November 2019 в 15:21
поделиться

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

3
ответ дан 24 November 2019 в 15:21
поделиться

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

1
ответ дан 24 November 2019 в 15:21
поделиться

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

Еще один изящный прием со статикой в ​​ReSharper - сделать набор связанных методов статическим с помощью рефакторинга «Make Method Static». Это переместит некоторые зависимости в параметры метода. Когда вы посмотрите на этот набор методов позже, вы можете обнаружить, что все они обращаются к определенному объекту определенного типа. Затем вы можете использовать рефакторинг «Make method non-static» и указать этот объект как новый указатель this . Это перемещает ваш метод в другой класс.

От этого:

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;
    }
}
1
ответ дан 24 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: