Warum beurteilt mich ReSharper nach diesem 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);
}
}
Die zweite Methode Der Parameter "settingsValue" von ValidateCorrespondingValueType wird von ReSharper mit der folgenden Meldung abgeblendet: "Der Parameter 'settingsValue' wird nur für Vorbedingungsprüfungen verwendet."
c#
resharper
preconditions
Corpsekicker
quelle
quelle
exceptionMessage
in denif
-block verschieben :)Antworten:
Es urteilt nicht, es versucht zu helfen :)
Wenn ReSharper feststellt, dass ein Parameter nur als Prüfung zum Auslösen einer Ausnahme verwendet wird, wird er ausgegraut, was darauf hinweist, dass Sie ihn nicht für "echte" Arbeiten verwenden. Dies ist höchstwahrscheinlich ein Fehler. Warum sollten Sie einen Parameter übergeben, den Sie nicht verwenden werden? Es zeigt normalerweise an, dass Sie es in einer Vorbedingung verwendet haben, es dann aber vergessen haben (oder nicht mehr benötigen), es an einer anderen Stelle im Code zu verwenden.
Da es sich bei der Methode um eine Assertionsmethode handelt (das heißt, sie bestätigt lediglich, dass sie gültig ist), können Sie die Nachricht unterdrücken, indem Sie sie
ValidateCorrespondingValueType
als Assertionsmethode markieren und dabei die Anmerkungsattribute von ReSharper verwenden , insbesondere das[AssertionMethod]
Attribut:quelle
settingValue
‚s - Typ kann nicht möglich sein , pre - Bedingung, da die Sache , die es gegen geprüft hat wird , ist nicht bekannt , bis einige Arbeit innerhalb des Körpers des Verfahrens geschehen ist![AssertionMethod]
.Interessanterweise zieht sich ReSharper zurück, wenn Sie die neue
nameof
Funktionalität in C # 6 verwenden:quelle
Das Folgende behebt das Problem (in ReSharper 2016.1.1, VS2015), aber ich bin nicht sicher, ob es das "richtige" Problem löst. In jedem Fall zeigt es die Mehrdeutigkeit in der Mechanik von ReSharper in Bezug auf dieses Thema:
Dies ergibt die Warnung:
Das geht aber nicht:
Es ist interessant, dass äquivalenter Code (die Inversion wurde von ReSharper: D durchgeführt) unterschiedliche Ergebnisse liefert. Es scheint, dass der Mustervergleich die zweite Version einfach nicht aufgreift.
quelle
Meine bevorzugte Lösung für dieses Problem ist make ReSharper denken , der Parameter wird verwendet. Dies hat einen Vorteil gegenüber der Verwendung eines Attributs, z. B.
UsedImplicitly
wenn Sie diesen Parameter nicht mehr verwenden, wird resharper Sie erneut warnen. Wenn Sie ein Attribut verwenden, fängt resharper auch zukünftige echte Warnungen nicht ab.Eine einfache Möglichkeit, Resharper glauben zu lassen, dass der Parameter verwendet wird, besteht darin, ihn durch
throw
eine Methode zu ersetzen . Also statt ......du schreibst:
Dies ist für zukünftige Programmierer eine gute Selbstdokumentation, und Resharper hört auf zu jammern.
Die Implementierung von ThrowPreconditionViolation ist trivial:
Eine Erweiterungsmethode für Ausnahmen ist die Verschmutzung von Namespaces, die jedoch ziemlich begrenzt ist.
quelle
[UsedImplicitly]
, ich wollte nicht verwenden,[AssertionMethod]
wie es nicht war, und verwendet klingt implizit genauer in meinem Fall (ich habe einen Wert an einen Rückruf in einem Konstruktor übergeben und das konstruierte Objekt zurückgegeben).Andere haben die Frage bereits beantwortet, aber niemand erwähnte die folgenden Möglichkeiten, die Warnung auszuschalten.
Fügen Sie dies über der Methodensignatur hinzu, um es nur für diese Methode zu deaktivieren:
Fügen Sie dies über der Klassendeklaration hinzu, um es für die gesamte Datei zu deaktivieren:
quelle