CA1062: ValidateArgumentsOfPublicMethods en llamadas co-constructor
-
21-08-2019 - |
Pregunta
Tengo una clase con dos constructores que se ven así:
public MyClass(SomeOtherClass source) : this(source, source.Name) { }
public MyClass(SomeOtherClass source, string name) { /* ... */ }
Cuando corro FxCop, se informa correctamente una violación de CA1062: ValidateArgumentsOfPublicMethods , porque si es source
null
en el primer constructor, arrojará un NullReferenceException
en source.Name
.
¿Hay alguna forma de solucionar esta advertencia?
Podría hacer un método de extensión que comprueba nulo y devuelve su argumento, pero sería fea. Además, según tengo entendido, no sería resolver la advertencia porque FxCop no se daría cuenta de lo que hace.
Solución
¿Así?
public MyClass(SomeOtherClass source) : this(source, source == null ? null : source.Name) { }
public MyClass(SomeOtherClass source, string name) { /* ... */ }
Otros consejos
Hay veces legítimos para desactivar las advertencias FxCop y esto podría muy bien ser uno, pero se puede corregir el problema, ya sea una expresión ternaria que comprueba nula y se produce una excepción (o sustituye un valor por defecto), o una llamada a un método estático que comprueba nula y lanza la excepción apropiado.
Dado que esta pregunta se hizo hace algún tiempo sólo quiero tomar nota con las funciones más adelante en C # ahora se puede también utilizar esto:
public MyClass(SomeOtherClass source) : this(source, source?.Name) { }
Yo diría que la única manera de solucionar esta advertencia sería para apagarlo. FxCop es una gran herramienta, pero a veces hay que recordar que es sólo una herramienta y puede hacer sugerencias que no siempre son apropiadas para su código.
En este ejemplo, diría ignorar la advertencia o deshabilitarlo si no quieres verlo.