СА1062:ValidateArgumentsOfPublicMethods при вызовах соконструктора
-
21-08-2019 - |
Вопрос
У меня есть класс с двумя конструкторами, которые выглядят следующим образом:
public MyClass(SomeOtherClass source) : this(source, source.Name) { }
public MyClass(SomeOtherClass source, string name) { /* ... */ }
Когда я запускаю FxCop, он правильно сообщает о нарушении СА1062:ValidateArgumentsOfPublicMethods, потому что, если source
является null
в первом конструкторе он выдаст NullReferenceException
на source.Name
.
Есть ли способ исправить это предупреждение?
Я мог бы создать метод расширения, который проверяет значение null и возвращает свой аргумент, но это было бы некрасиво.Кроме того, насколько я понимаю, это не устранит предупреждение, потому что FxCop не понимает, что делает.
Решение
Так?
public MyClass(SomeOtherClass source) : this(source, source == null ? null : source.Name) { }
public MyClass(SomeOtherClass source, string name) { /* ... */ }
Другие советы
Есть законные случаи для отключения предупреждений FxCop, и это вполне может быть одним из них, но вы можете исправить проблему либо с помощью троичного выражения, которое проверяет значение null и выдает исключение (или заменяет значение по умолчанию), либо вызовом статического метода. метод, который проверяет значение null и выдает соответствующее исключение.
Поскольку этот вопрос был задан некоторое время назад, я просто хочу отметить, что с более поздними функциями C# теперь вы также можете использовать это:
public MyClass(SomeOtherClass source) : this(source, source?.Name) { }
Я бы сказал, что единственный способ исправить это предупреждение — отключить его.FxCop — отличный инструмент, но иногда вам нужно помнить, что это всего лишь инструмент и он может вносить предложения, которые не всегда подходят вашему коду.
В этом примере я бы посоветовал игнорировать предупреждение или отключить его, если вы не хотите его видеть.