Pourquoi ReSharper me juge pour ce code?
private Control GetCorrespondingInputControl(SupportedType supportedType, object settingValue)
{
this.ValidateCorrespondingValueType(supportedType, settingValue);
switch(supportedType)
{
case SupportedType.String:
return new TextBox { Text = (string)settingValue };
case SupportedType.DateTime:
return new MonthPicker { Value = (DateTime)settingValue, ShowUpDown = true };
default:
throw new ArgumentOutOfRangeException(string.Format("The supported type value, {0} has no corresponding user control defined.", supportedType));
}
}
private void ValidateCorrespondingValueType(SupportedType supportedType, object settingValue)
{
Type type;
switch(supportedType)
{
case SupportedType.String:
type = typeof(string);
break;
case SupportedType.DateTime:
type = typeof(DateTime);
break;
default:
throw new ArgumentOutOfRangeException(string.Format("The supported type value, {0} has no corresponding Type defined.", supportedType));
}
string exceptionMessage = string.Format("The specified setting value is not assignable to the supported type, [{0}].", supportedType);
if(settingValue.GetType() != type)
{
throw new InvalidOperationException(exceptionMessage);
}
}
Le paramètre "settingValue" de la deuxième méthode ValidateCorrespondingValueType est grisé avec le message suivant de ReSharper: "Le paramètre" settingValue "est uniquement utilisé pour les vérifications de précondition."
c#
resharper
preconditions
Corpsekicker
la source
la source
exceptionMessage
dans leif
bloc :)Réponses:
Ce n'est pas de juger, c'est d'essayer d'aider :)
Si ReSharper voit qu'un paramètre n'est utilisé que comme contrôle pour lever une exception, il le grise, indiquant que vous ne l'utilisez pas réellement pour un travail "réel". C'est probablement une erreur - pourquoi passer un paramètre que vous n'allez pas utiliser? Cela indique généralement que vous l'avez utilisé dans une condition préalable, mais que vous avez ensuite oublié (ou n'avez plus besoin) de l'utiliser ailleurs dans le code.
Étant donné que la méthode est une méthode d'assertion (c'est-à-dire qu'elle ne fait qu'affirmer qu'elle est valide), vous pouvez supprimer le message en marquant
ValidateCorrespondingValueType
comme méthode d'assertion, en utilisant les attributs d'annotation de ReSharper , en particulier l'[AssertionMethod]
attribut:la source
settingValue
ne peut pas être une condition préalable, car la chose contre laquelle il est vérifié n'est pas connue tant que du travail n'a pas été effectué dans le corps de la méthode![AssertionMethod]
.Fait intéressant, ReSharper recule si vous utilisez la nouvelle
nameof
fonctionnalité en C # 6:la source
Ce qui suit résout le problème (dans ReSharper 2016.1.1, VS2015), mais je ne suis pas sûr que cela résout le «bon» problème. Dans tous les cas, cela montre l'ambiguïté dans la mécanique de ReSharper concernant ce sujet:
Cela donne l'avertissement:
Mais cela ne fait pas:
Il est intéressant de noter qu'un code équivalent (l'inversion a été faite par ReSharper: D) donne des résultats différents. Il semble que la correspondance de motifs ne reprend tout simplement pas la deuxième version.
la source
Ma solution préférée à ce problème est de faire en sorte que resharper pense que le paramètre est utilisé. Cela a un avantage par rapport à l' aide d' un attribut tel que
UsedImplicitly
parce que si jamais vous ne en utilisant ce paramètre arrêt, ReSharper commencera à vous avertir à nouveau. Si vous utilisez un attribut, le resharper ne captera pas non plus les futurs avertissements réels.Un moyen simple de faire en sorte que resharper pense que le paramètre est utilisé consiste à le remplacer
throw
par une méthode. Alors au lieu de ......vous écrivez:
Ceci est bien auto-documenté pour les futurs programmeurs, et le resharper arrête de pleurnicher.
L'implémentation de ThrowPreconditionViolation est triviale:
Une méthode d'extension sur Exception est la pollution de l'espace de noms, mais elle est assez contenue.
la source
[UsedImplicitly]
, je ne voulais pas utiliser[AssertionMethod]
car il ne l'était pas, et utilisé implicitement semble plus précis dans mon cas (je passais une valeur à un rappel dans un constructeur et retournais l'objet construit).D'autres ont déjà répondu à la question, mais personne n'a mentionné les façons suivantes de désactiver l'avertissement.
Ajoutez ceci au-dessus de la signature de la méthode pour la désactiver uniquement pour cette méthode:
Ajoutez ceci au-dessus de la déclaration de classe pour la désactiver pour tout le fichier:
la source