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

时间:2012-05-22 15:00:28

标签: asp.net-mvc-3 code-analysis

  

错误CA1822:Microsoft.Performance:'this'参数(或'我'   在Visual Basic中)'SomeController.AnAction(string,string)'永远不会   用过的。将成员标记为静态(或在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 };
    } 

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

2 个答案:

答案 0 :(得分:10)

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

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

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

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

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

当然,如果MVC的基础设施需要它是一个实例方法,那么你应该只是通过注释来抑制警告,以表明这一事实。

答案 1 :(得分:4)

我认为CA并没有考虑到这是MVC app中的控制器操作。我会抑制。