Ich mache eine Erweiterung zu Visual Studio. Innerhalb des Codes verwende ich Code-Verträge, um Assertions und Checks zu machen. Ich setze die Warnoption auf hoch.Wie kann ich Code Contracts veranlassen, eine bestimmte Assembly-Referenz zu ignorieren?
Ich möchte diese Warnstufe beibehalten und dabei alle Prüfungen ignorieren, die an EnvDTE-Referenzen vorgenommen werden.
Betrachten Sie das folgende Codebeispiel:
public static string GetAbsoluteOutputFolder(EnvDTE.Project project)
{
if (project == null) throw new ArgumentNullException("project");
var path =
project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString();
//...
}
Mit meiner aktuellen Einstellungen, CC würde mir verlangen die folgenden Prüfungen hinzufügen, bevor die path
Variablen zugewiesen:
Contract.Assume(project.ConfigurationManager != null);
Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null);
Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null);
Deshalb, was Ich mag würde Um dies zu tun, muss CC angewiesen werden, EnvDTE zu "vertrauen" und diese Typen und ihre Eigenschaften zu ignorieren.
Ich dachte, die CC-Option "Sei optimistisch für externe API" diente genau diesem Zweck; stellt sich heraus, dass es nicht geht.
Gibt es eine Möglichkeit, es so zu verhalten, wie ich will , die keine untere Warnstufe benötigen würde?
BEARBEITEN: Ich möchte eine Lösung, die auf Projektebene arbeiten würde und die noch "regelmäßige" Prüfungen ermöglichen würde.
Wenn ich ich wäre, würde ich nur die Checks hinzufügen, die Sie weglassen möchten.Wenn Ihr Code wegen einer Nullreferenz in EnvDTE.Project explodiert, sollten Sie genau wissen, wo das Problem liegt, anstatt zu versuchen, den Nullpunkt zu erraten. –
@MikeBurdick Die Sache ist, dass einige dieser Eigenschaften sehr wahrscheinlich nie null sind. Da diese Baugruppe jedoch nicht mit Verträgen kompiliert wurde, kann der Motor nichts sagen. Daher behandelt es diese Eigenschaften wie Eigenschaften ohne Verträge und erzwingt die sinnlose Überprüfung derselben Eigenschaft immer wieder. Wenn es eine globale, do-it-once Möglichkeit gäbe, die '' Configuration.Properties'' zum Beispiel zu erzwingen, die niemals null zurückgibt, würde ich sie gerne benutzen, aber es gibt sie nicht. Also, IMHO wäre das kleinere Übel, CC zu sagen, dass es einfach jeden Code ignorieren soll, der zu dieser bestimmten Assembly gehört. – Crono