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?
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.
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.
Tags und Links c# code-analysis fxcop cyclomatic-complexity code-metrics