¿Alguien puede explicar el propósito y la resolución de CA1822 en una acción del controlador?

Error CA1822: Microsoft.Performance: el parámetro 'this' (o 'Me' en Visual Basic) de 'SomeController.AnAction(string, string)' nunca se usa. Marque el miembro como estático (o Compartido en Visual Basic) o use 'this'/'Me' en el cuerpo del método o al menos un descriptor de acceso a la propiedad, si corresponde.

Una acción estática produce 404 no encontrado cuando se solicita a través de URL. La acción funciona como se esperaba con el análisis de código desactivado. ¿Cuál es el punto de esto y cuál es el remedio apropiado?

Nota: que el tipo de devolución de la acción es PartialViewResult, no parece que el análisis de código se queje de esto si el tipo de devolución es 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 };
    } 

Actualizar: Parece que cambiar el tipo de devolución a ActionResult resuelve el error, y PartialViewResult es un ActionResult, por lo que debería funcionar.

preguntado el 22 de mayo de 12 a las 16:05

Incluya el código en cuestión o un fragmento similar:

2 Respuestas

Dudo que cambiar el tipo de retorno sin llamar usando ningún miembro de la instancia realmente resuelve el problema. Sospecho que para cambiar el tipo de devolución, cambió la declaración de devolución a algo que accedió a un miembro de la instancia.

Ahora no sé si el manejo de rutas en MVC será dejar marca el método como estático, pero vale la pena investigarlo. Aunque la advertencia se da en términos de rendimiento, yo pensaría en ella en términos de intención y legibilidad.

Por lo general, hay dos razones para que un método o propiedad sea un miembro de instancia (en lugar de estático):

  • Necesita acceder a otro miembro de la instancia, porque la forma en que se comporta depende del estado del objeto.
  • Debe comportarse polimórficamente en función del tipo real de la instancia a la que se llama, de modo que el comportamiento pueda anularse.

Si ninguno de estos es el caso, entonces el método puede hacerse estático, lo que Indica que no se espera ningún polimorfismo ni se requiere ningún estado de instancia. Un miembro estático anuncia efectivamente que el único estado del que depende es el estado del tipo en sí (y los parámetros), y que no se comportará polimórficamente. Aparte de cualquier otra cosa, eso significa que puede test sin crear una instancia en absoluto, también.

Por supuesto, si la infraestructura de MVC requiere para ser un método de instancia, entonces simplemente debe suprimir la advertencia, con un comentario para indicar ese hecho.

contestado el 30 de mayo de 12 a las 19:05

Sí, si lo hace estático, la acción no está disponible en el tiempo de ejecución porque crea una instancia del controlador e intenta ejecutar la acción allí según la ruta de la URL. Sospecho que CA permite esta diapositiva si es un ActionResult... porque tan pronto como hice el tipo de retorno, el error desapareció (el tipo de retorno original PartialViewResult hereda de ActionResult, por lo que no es necesario cambiar ningún otro código). Aunque no tengo idea. Premio su respuesta porque fue muy informativa y aprendí algo nuevo, a pesar de que no llegamos al fondo real de esto. - metamagnate

Creo que CA simplemente no tiene en cuenta que esta es una acción del controlador en la aplicación MVC. reprimiría.

contestado el 24 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.