static-analysis

___ qstnhdr ___ C # Zusammenfassung Dispose-Methode ___ qstntxt ___

Ich habe eine abstrakte Klasse, die IDisposable wie folgt implementiert:

%Vor%

In Visual Studio 2008 Team System habe ich Code Analysis für mein Projekt ausgeführt und eine der folgenden Warnungen war die folgende:

  

Microsoft.Design: Ändern Sie "ConnectionAccessor.Dispose ()" so, dass es Dispose (true) aufruft, und ruft dann GC.SuppressFinalize für die aktuelle Objektinstanz ("this" oder "Me" in Visual Basic) auf und kehrt dann zurück .

Ist es nur albern, mir zu sagen, dass ich den Körper einer abstrakten Methode modifizieren soll, oder sollte ich etwas in einer abgeleiteten Instanz von %code% machen?

    
___ answer1704247 ___

Das einzige Problem, das ich mit den bisher gelieferten Antworten haben könnte, ist, dass alle davon ausgehen, dass Sie brauchen, um einen Finalizer zu haben, was nicht unbedingt der Fall ist. Mit der Finalisierung ist ein ziemlich signifikanter Leistungsaufwand verbunden, den ich nicht allen abgeleiteten Klassen auferlegen möchte, wenn dies nicht notwendig ist.

Siehe diesen Blogbeitrag von Joe Duffy, der erklärt, wann Sie einen Finalizer benötigen oder nicht, und wie Sie das Dispose-Pattern in jedem Fall richtig implementieren können.
Wenn Sie Joes Blogpost zusammenfassen, sollten Sie keinen Finalizer implementieren, es sei denn, Sie tun etwas, das mit nicht verwaltetem Speicher zu tun hat. Als allgemeine Faustregel gilt, dass wenn Ihre Klasse nur Verweise auf verwaltete Typen enthält, die IDisposable selbst implementieren, Sie den Finalizer nicht benötigen (aber IDisposable implementieren und diese Ressourcen entfernen sollten). Wenn Sie nicht verwaltete Ressourcen direkt aus Ihrem Code (PInvoke?) Zuweisen und diese Ressourcen freigegeben werden müssen, benötigen Sie eine. Eine abgeleitete Klasse kann immer einen Finalizer hinzufügen, wenn sie dies wirklich benötigt, aber wenn alle abgeleiteten Klassen durch Einfügen in die Basisklasse einen Finalizer erhalten, werden alle abgeleiteten Klassen vom Leistungstreffer der finalisierbaren Objekte beeinflusst, wenn dieser Overhead nicht vorhanden ist notwendig.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123abstractclass ___ Abstrakte Klassen sind Klassen, die nicht instanziiert werden können. Sie existieren, um verschiedenen konkreten Klassen gemeinsame Funktionalität und Schnittstellenspezifikationen zur Verfügung zu stellen. ___ answer1703769 ___

Obwohl es ein wenig wie Nit-Picking scheint, ist der Ratschlag gültig. Sie geben bereits an, dass Sie erwarten, dass Untertypen von ConnectionAccessor etwas haben, das sie entsorgen müssen. Daher scheint es besser zu sein, sicherzustellen, dass die richtige Bereinigung (in Bezug auf den GC.SuppressFinalize-Aufruf) von der Basisklasse durchgeführt wird, anstatt sich auf jeden Untertyp zu verlassen.

Ich verwende das in Bruce Wagners Buch Effective C # genannte Entsorgungsmuster, das im Grunde Folgendes ist:

%Vor%     
___ answer1703760 ___

Die Warnung ist jedoch interessant. Eric Lippert, einer der C # -Designer, bloggte darüber, warum Fehlermeldungen "Diagnostisch, aber nicht präskriptiv sein sollten: Beschreibe das Problem, nicht die Lösung". Lesen Sie hier.

    
___ answer1703691 ___

Die Warnung weist Sie im Wesentlichen an, das Dispose-Muster zu implementieren in deiner Klasse.

Der resultierende Code sollte wie folgt aussehen:

%Vor%     
___ tag123dispose ___ Führt anwendungsdefinierte Tasks zum Freigeben, Freigeben oder Zurücksetzen nicht verwalteter Ressourcen aus ___ tag123statistische Analyse ___ "Statische Analyse" bezieht sich auf die Software-Tools (oder ihre Verwendung) zur Analyse von Anwendungscode für beliebige Eigenschaften wie Fehler (nicht initialisierte Variablen, mögliche SQL-Injection-Attacken, ist dieser Code tot, kann ein Argument null sein, ...) oder Struktur (was ist das Aufrufdiagramm für diesen Code? Gibt es einen doppelten Code? Welche Informationen werden zwischen den Komponenten ausgetauscht?). ___ answer1703742 ___

Sie sollten dem herkömmlichen Muster für die Implementierung von %code% folgen. Das Erstellen von %code% virtual wird als schlechte Methode betrachtet, da das herkömmliche Muster die Wiederverwendung von Code in "managed cleanup" (API-Client ruft %code% direkt oder via %code% ) und "nicht verwaltete Bereinigung" (GC-Aufruffinalisierer) hervorhebt. Zur Erinnerung, das Muster ist das:

%Vor%

Der Schlüssel hier ist, dass es keine Verdoppelung zwischen dem Finalizer und %code% für die nicht verwaltete Bereinigung gibt und dass jede abgeleitete Klasse sowohl die verwaltete als auch die nicht verwaltete Bereinigung erweitern kann.

Für Ihren Fall sollten Sie Folgendes tun:

%Vor%

und lass alles andere so wie es ist. Auch das ist von zweifelhaftem Wert, da Sie Ihre abgeleiteten Klassen dazu zwingen, jetzt %code% zu implementieren - und woher wissen Sie, dass sie alle brauchen? Wenn Ihre Basisklasse nichts zu erledigen hat, aber die meisten abgeleiteten Klassen wahrscheinlich (mit einigen Ausnahmen, vielleicht), dann geben Sie einfach eine leere Implementierung an. Es ist was %code% (selbst abstrakt) tut, also gibt es Präzedenzfälle.

    
___
3
Antworten

Wie schreibt man einen benutzerdefinierten Intermodular-Pass in LLVM?

Ich habe einen Standard-Analysepass in LLVM geschrieben, indem ich die FunctionPass -Klasse erweitert habe. Alles scheint einen Sinn zu ergeben. Nun möchte ich ein paar intermodulare Pässe schreiben, also Pässe, mit denen ich mehr als ein M...
12.05.2015, 18:01
2
Antworten

C # Statische Analyse, mögliche Werte für eine Variable / einen Parameter

In Code, der den folgenden Beispielen ähnlich ist, möchte ich in der Lage sein, Code statistisch zu analysieren, um die Liste der möglichen Werte zu ermitteln, die an SpecialFunction () übergeben werden. %Vor% Ich kann das C # bereits in ein...
13.04.2012, 17:33
2
Antworten

Lua-zertifiziert für den Einsatz an einem Flugzeug oder Straßenfahrzeug?

Weiß jemand, ob Lua für eine Flugzeugzelle oder ein Straßenfahrzeug zugelassen wurde? Zertifizierungsprozesse wie DO178B (RTCA) oder Standardisierung wie ISO 26262 (Straßenfahrzeuge). Die Zertifizierung ist wie eine Rechtsprechung, und ich wü...
02.12.2009, 04:46
2
Antworten

Übergeben einer Liste als URL-Wert an urlopen

Motivation Motiviert durch dieses Problem - das OP verwendete urlopen() und übergab versehentlich eine sys.argv -Liste anstelle von a Zeichenfolge als url . Diese Fehlermeldung wurde ausgelöst:    AttributeError: Das Objekt 'li...
19.06.2017, 15:54
5
Antworten

Sollten statische Analysewarnungen den CI-Build nicht bestehen?

Unser Team untersucht in unserem Projekt verschiedene Optionen für die statische Analyse und hat gemischte Meinungen darüber, ob unser Continuous Integration-Build aufgrund von Warnungen durch statische Analysen scheitern soll. Das Argument g...
08.03.2010, 10:53
4
Antworten

Gibt es ein Tool für .Net / C #, um * Laufzeit * Abhängigkeiten zwischen Klassen zu erfassen?

Welches Tool kann ich für .Net / C # -Projekte verwenden, um Laufzeitabhängigkeiten zwischen Klassen zu erfassen? Ich fand diese Frage sehr nützlich, aber die vorgeschlagenen Tools erfassen ein statisches Abhängigkeitsdiagramm. Ich möchte einf...
15.08.2012, 18:32
3
Antworten

Wie gut ist es, Codeverträge in Visual Studio 2010 Professional (dh keine statische Prüfung) für Klassenbibliotheken zu verwenden?

Ich erstelle Klassenbibliotheken, einige, die von anderen auf der ganzen Welt benutzt werden, und jetzt, wo ich Visual Studio 2010 benutze, frage ich mich, wie gut es für mich ist, auf Codeverträge umzusteigen, anstatt regelmäßige if-Anweisungen...
13.04.2010, 18:00
3
Antworten

Ist die statische Codeverifizierung für mögliche Nullobjektverweise verfügbar?

Ich hätte gerne eine Möglichkeit, Warnungen zu erhalten, wenn eine Objektreferenz möglicherweise eine Null-Referenz-Ausnahme auslösen könnte, so dass ich für sie defensiven Code schreiben kann. Ich habe Resharper angeschaut, aber ich habe dor...
11.04.2012, 15:44
1
Antwort

Liste der FindBugs 2.0 Bugs nach Rang?

Ich weiß, dass es Fehler gibt, aber ich hätte gerne eine Liste mit zusätzlichen Informationen über Rang (1 bis 20 in Version 2.0) oder mindestens über Ranking-Gruppen (von Besorgnis, beunruhigend, unheimlich, gruseligsten). Vielleicht vermisse...
06.03.2012, 12:44
3
Antworten

Verwirrende Kontrollflussanalyse aus dem Parasoft C ++ Test

Wir verwenden den Parasoft C ++ Test , um unseren Code statistisch zu analysieren. Es hat Probleme mit Code wie dem folgenden: %Vor% Er warnt bei der *x; -Zeile, dass:    Auf freigegebenen Speicher sollte unter keinen Umständen nachtr...
26.04.2011, 20:34