13

错误 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 };
    } 

更新:看起来将返回类型更改为 ActionResult 可以解决错误,并且 PartialViewResult 是一个 ActionResult 所以它应该可以工作。

4

2 回答 2

10

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

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

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

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

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

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

于 2012-05-30T18:30:14.213 回答
5

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

于 2012-05-24T16:26:18.467 回答