任何人都可以在控制器动作上解释CA1822的目的和解决方案吗?

Met*_*uru 12 code-analysis asp.net-mvc-3

错误CA1822:Microsoft.Performance:从不使用'SomeController.AnAction(string,string)'中的'this'参数(或Visual Basic中的'Me').将成员标记为静态(或在Visual Basic中为Shared)或在方法体中使用"this"/"Me"或至少使用一个属性访问器(如果适用).

当通过URL请求时,静态操作产生404未找到.该操作正在按预期工作,代码分析已关闭.这有什么意义,什么是适当的补救措施?

请注意,操作的返回类型是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 };
    } 
Run Code Online (Sandbox Code Playgroud)

更新:看起来将返回类型更改为ActionResult可以解决错误,而PartialViewResult是ActionResult,因此它应该可以正常工作.

Jon*_*eet 10

我怀疑在不调用任何实例成员的情况下更改返回类型确实可以解决问题.我怀疑为了更改返回类型,您将return语句更改为访问实例成员的内容.

现在我不知道MVC中的路由处理是否会让你将方法标记为静态,但值得研究.尽管警告是在性能方面给出的,但我会从意图和可读性的角度来考虑它.

通常,将方法或属性作为实例成员(而不是静态)有两个原因:

  • 它需要访问另一个实例成员,因为它的行为方式取决于对象的状态
  • 它需要根据调用它的实例的实际类型进行多态操作,以便可以覆盖该行为

如果这两种情况都不是这样的话,那么该方法可以是静态的,这表明没有预期的多态性并且不需要实例状态.静态成员有效地宣告它所依赖的唯一状态是类型本身的状态(和参数),并且它不会以多态方式运行.除此之外,这意味着您可以在不创建实例的情况下对其进行测试.

当然,如果MVC的基础结构要求它是一个实例方法,那么你应该只是抑制警告,并用注释来表明这一事实.


Lef*_*une 5

我认为 CA 只是没有考虑到这是 MVC 应用程序中的控制器操作。我会压制。