Wie kann die zyklomatische Komplexität in einer Methode mit 13 Event-Handler-Subskriptionen 27 sein?

8

Wir haben diesen Code, sortof:

%Vor%

Code-Analyse in VS10 Ultimate sagt "zyklomatische Komplexität von 27". Entfernen einer der Linien macht die zyklomatische Komplexität 25.

Es gibt keine Verzweigung, also wie ist das möglich?

    
Johann Gerell 20.04.2012, 10:05
quelle

3 Antworten

17

Denken Sie daran, dass die Codeanalyse die IL in Ihrer Assembly betrachtet, nicht Ihren Quellcode. Es gibt nichts in der IL, das nativ Lambda-Ausdrücke unterstützt, daher sind sie ein Konstrukt des Compilers. Sie können die Besonderheiten von was ist output hier . Aber im Grunde wird Ihr Lambda-Ausdruck in eine private statische Klasse umgewandelt, die ein anonymer Deligate ist. Wenn Sie jedoch jedes Mal eine Instanz des anonymen Deligate erstellen, auf die im Code verwiesen wird, wird das Deligate zwischengespeichert. Jedes Mal, wenn Sie einen Lambda-Ausdruck zuweisen, prüft er, ob eine Instanz dieses Lambda-Deligate erstellt wurde. Wenn dies der Fall ist, wird das zwischengespeicherte Deligate verwendet. Dies erzeugt ein if / else in der IL, wodurch die Komplexität um 2 erhöht wird. In dieser Funktion ist also die Komplexität 1 + 2 * (lambda express) = 1 + 2 * (13) = 27, was die richtige Zahl ist.

    
user957902 20.04.2012, 11:59
quelle
3

Der C # -Compiler erzeugt tatsächlich einige ziemlich "interessante" ILs für anonyme Methoden, einschließlich lambdas. Für jedes Feld wird ein privates Feld erstellt. Vor der Zuweisung des Werts in der konsumierenden Methode wird dann überprüft, ob der Wert null ist, wodurch der kompilierten Methode ein If-Zweig hinzugefügt wird. Das Code-Metriken-Tool sollte dies ignorieren (http://social.msdn.microsoft.com/Forums/eu/vstscode/thread/8c17f569-5ee3-4d26-bf09-4ad4f9289705, Ссылка ), und wir können hoffen, dass es irgendwann wird. Im Moment müssen Sie das Problem ziemlich ignorieren, wenn Sie das Gefühl haben, dass es falsch positiv ist.

    
Nicole Calinoiu 20.04.2012 12:05
quelle
1

Es ist wahrscheinlich, dass dies wahrscheinlich darauf zurückzuführen ist, dass die obigen Anweisungen in das Event-Accessor-Format konvertiert wurden, nämlich

%Vor%

Siehe Ссылка und Hilfe> für Diskussionen über das Event-Accessor-Format.

    
Andrew Jones 20.04.2012 10:11
quelle