CA1062: ValidateArgumentsOfPublicMethods sulle chiamate co-costruttore
-
21-08-2019 - |
Domanda
Ho una classe con due costruttori che assomigliano a questo:
public MyClass(SomeOtherClass source) : this(source, source.Name) { }
public MyClass(SomeOtherClass source, string name) { /* ... */ }
Quando eseguo FxCop, si segnala correttamente una violazione dei CA1062: ValidateArgumentsOfPublicMethods , perché se è source
null
nel primo costruttore, si getterà un NullReferenceException
su source.Name
.
C'è un modo per risolvere questo avvertimento?
ho potuto fare un metodo di estensione che controlla nulla e restituisce il suo argomento, ma sarebbe brutto. Inoltre, a quanto mi risulta, non sarebbe risolvere l'avviso perché FxCop non avrebbe capito ciò che fa.
Soluzione
Ti piace questa?
public MyClass(SomeOtherClass source) : this(source, source == null ? null : source.Name) { }
public MyClass(SomeOtherClass source, string name) { /* ... */ }
Altri suggerimenti
Ci sono momenti legittimi per spegnere gli avvertimenti FxCop e questo potrebbe benissimo essere uno, ma è possibile correggere il problema sia da un espressione ternaria che controlla nullo e genera un'eccezione (o sostituisce un valore di default), o di una chiamata ad un metodo statico che controlla nullo e genera l'eccezione appropriata.
Dal momento che questa domanda è stato chiesto qualche tempo fa voglio solo notare con le caratteristiche più tardi in C # Ora è possibile utilizzare anche questo:
public MyClass(SomeOtherClass source) : this(source, source?.Name) { }
Direi che l'unico modo per risolvere questo avvertimento potrebbe essere quella di spegnerlo. FxCop è un grande strumento, ma a volte è necessario ricordare che è solo uno strumento e può dare suggerimenti che non sono sempre raccordo al codice.
In questo esempio vorrei dire ignorare l'avviso o disattivarlo se non si vuole vedere.