Может ли кто-нибудь объяснить цель и разрешение CA1822 в отношении действия контроллера?

Ошибка CA1822: Microsoft.Performance: параметр 'this' (или 'Me' в Visual Basic) "SomeController.AnAction(строка, строка)" никогда не используемый. Отметьте элемент как статический (или общий в Visual Basic) или используйте 'this'/'Me' в теле метода или, по крайней мере, один аксессор свойств, если необходимо.

Статическое действие дает 404, не найденное при запросе через URL. Действие работает как ожидалось, когда анализ кода отключен. Какая точка зрения и что такое подходящее средство?

Примечание, что возвращаемый тип действия - PartialViewResult, похоже, что анализ кода не жалуется на это, если тип возврата - ActionResult.

    [HttpPost]
    public PartialViewResult BlankEditorRow(string formId, Common.Entities.Common.ObjTypeEnum objType)
    {
        if (objType == Common.Entities.Common.ObjTypeEnum.Regular)
            return new AjaxPartialViewResult("_RowEditor", new ProcedureEntryEntity()) { UpdateValidationForFormId = formId };
        else
            return new AjaxPartialViewResult("_TemplateRowEditor", new ProcedureEntryEntity()) { UpdateValidationForFormId = formId };
    } 

Обновление: Похоже, что изменение типа возврата в ActionResult разрешает ошибку, а PartialViewResult - ActionResult, поэтому он должен работать.

Ответ 1

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

Теперь я не знаю, будет ли обработка маршрута в MVC позволять вам пометить метод как статический, но его стоит исследовать. Несмотря на то, что предупреждение дается с точки зрения производительности, я бы подумал об этом с точки зрения намерения и удобочитаемости.

Обычно для метода или свойства есть две причины быть членом экземпляра (а не статическим):

  • Ему нужно получить доступ к другому члену экземпляра, потому что способ его поведения зависит от состояния объекта
  • Он должен вести себя полиморфно на основе фактического типа вызываемого им экземпляра, так что поведение может быть переопределено

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

Конечно, если инфраструктура MVC требует, чтобы это был метод экземпляра, вы должны просто подавить предупреждение с комментарием, чтобы указать этот факт.

Ответ 2

Я думаю, что CA просто не учитывает, что это действие контроллера в приложении MVC. Я бы подавил.