CA1502: Übermäßige Komplexität vermeiden.

Eigenschaft Wert
Regel-ID CA1502
Titel Übermäßige Komplexität vermeiden.
Kategorie Wartbarkeit
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardschwellenwert 25
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Eine Methode weist eine übermäßige zyklomatische Komplexität auf.

Regelbeschreibung

Zyklomatische Komplexität ermöglicht Aussagen über die Anzahl linear unabhängiger Pfade in einer Methode, wobei die Anzahl der Pfade durch die Anzahl und Komplexität bedingter Branches bestimmt wird. Eine geringe zyklomatische Komplexität gibt im Allgemeinen eine Methode an, die leicht verständlich, getestet und gewartet werden kann. Die zyklomatische Komplexität wird anhand eines Ablaufsteuerungsdiagramms der Methode berechnet und wie folgt angegeben:

zyklomatische Komplexität = die Anzahl der Kanten - die Anzahl der Knoten + 1

Ein Knoten stellt einen Logic Branch-Punkt dar, und eine Kante stellt eine Linie zwischen Knoten dar.

Die Regel meldet einen Verstoß, wenn die zyklomatische Komplexität einer Methode größer als 25 ist. Sie können jedoch den Schwellenwert konfigurieren und auch andere Arten von Symbolen angeben, die die Regel analysieren soll.

Weitere Informationen zu Codemetriken finden Sie unter Messen der Komplexität von verwaltetem Code.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, müssen Sie die Methode umgestalten, um die zyklomatische Komplexität zu verringern.

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, eine Warnung aus dieser Regel zu unterdrücken, wenn die Komplexität nicht leicht reduziert werden kann und die Methode leicht verständlich, getestet und gewartet werden kann. Insbesondere eine Methode, die eine große switch-Anweisung (Select in Visual Basic) enthält, ist ein Kandidat für Ausschluss. Das Risiko, dass die Codebasis später im Entwicklungsdurchlauf oder eine unerwartete Änderung des Laufzeitverhaltens in zuvor versendetem Code zu destabilisieren ist, kann die Vorteile Wartbarkeit der Umgestaltung des Codes überwiegen.

Hinweis

Möglicherweise werden falsch positive Warnungen von dieser Regel angezeigt, wenn alle der folgenden Punkte zutreffen:

  • Sie verwenden Visual Studio 2022, Version 17.5 oder höher, mit einer älteren Version des .NET SDK, d. h. .NET 6 oder früher.
  • Sie verwenden die Analysetools aus dem .NET 6 SDK oder einer älteren Version der Analysetoolpakete, z. B. Microsoft. CodeAnalysis.FxCopAnalyzers.

Die falsch positiven Warnungen sind auf einen Breaking Change im C#-Compiler zurückzuführen. Erwägen Sie die Verwendung von neueren Analysetools, die den Hotfix für falsch positive Warnungen enthalten. Führen Sie ein Upgrade auf Microsoft. CodeAnalysis.NetAnalyzers Version 7.0.0-preview1.22464.1 oder höher aus, oder verwenden Sie die Analysetools aus dem .NET 7 SDK.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA1502
// The code that's violating the rule is on this line.
#pragma warning restore CA1502

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

[*.{cs,vb}]
dotnet_diagnostic.CA1502.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Konfigurieren des Schwellenwerts

Sie können sowohl den Schwellenwert, an dem diese Regel ausgelöst wird, als auch die Arten der zu analysierenden Symbole konfigurieren. Folgende Arten von Symbolen sind zulässig:

  • Assembly
  • Namespace
  • Type
  • Method
  • Field
  • Event
  • Property
  1. Erstellen Sie eine Textdatei mit dem Namen CodeMetricsConfig.txt.

  2. Fügen Sie der Textdatei den gewünschten Schwellenwert im folgenden Format hinzu:

    CA1502: 10
    

    In diesem Beispiel ist die Regel so konfiguriert, dass sie ausgelöst wird, wenn die zyklomatische Komplexität einer Methode größer als 10 ist.

    CA1502(Type): 4
    

    In diesem Beispiel ist die Regel so konfiguriert, dass sie ausgelöst wird, wenn die zyklomatische Komplexität eines Typs größer als 4 ist. Mit dieser Konfigurationsdatei würde die Regel weiterhin Methoden mit einer zyklomatischen Komplexität melden, die größer als der Standardwert (25) ist.

  3. Markieren Sie in der Projektdatei die Buildaktion der Konfigurationsdatei als AdditionalFiles. Beispiel:

    <ItemGroup>
      <AdditionalFiles Include="CodeMetricsConfig.txt" />
    </ItemGroup>
    

So berechnen Sie die zyklomatische Komplexität

Die zyklomatische Komplexität wird berechnet, indem der Wert 1 Folgendem hinzugefügt wird:

  • Die Anzahl von Branches (z. B. if, while und do)
  • Die Anzahl von case-Anweisungen in einem switch

Beispiele

In den folgenden Beispielen werden Methoden veranschaulicht, die unterschiedliche zyklomatische Komplexität aufweisen.

Zyklomatische Komplexität von 1

public void Method()
{
    Console.WriteLine("Hello World!");
}
Public Sub Method()
    Console.WriteLine("Hello World!")
End Sub

Zyklomatische Komplexität von 2

void Method(bool condition)
{
    if (condition)
    {
        Console.WriteLine("Hello World!");
    }
}
Public Sub Method(ByVal condition As Boolean)
    If (condition) Then
        Console.WriteLine("Hello World!")
    End If
End Sub

Zyklomatische Komplexität von 3

public void Method(bool condition1, bool condition2)
{
    if (condition1 || condition2)
    {
        Console.WriteLine("Hello World!");
    }
}
Public Sub Method(ByVal condition1 As Boolean, ByVal condition2 As Boolean)
    If (condition1 OrElse condition2) Then
        Console.WriteLine("Hello World!")
    End If
End Sub

Zyklomatische Komplexität von 8

public void Method(DayOfWeek day)
{
    switch (day)
    {
        case DayOfWeek.Monday:
            Console.WriteLine("Today is Monday!");
            break;
        case DayOfWeek.Tuesday:
            Console.WriteLine("Today is Tuesday!");
            break;
        case DayOfWeek.Wednesday:
            Console.WriteLine("Today is Wednesday!");
            break;
        case DayOfWeek.Thursday:
            Console.WriteLine("Today is Thursday!");
            break;
        case DayOfWeek.Friday:
            Console.WriteLine("Today is Friday!");
            break;
        case DayOfWeek.Saturday:
            Console.WriteLine("Today is Saturday!");
            break;
        case DayOfWeek.Sunday:
            Console.WriteLine("Today is Sunday!");
            break;
    }
}
Public Sub Method(ByVal day As DayOfWeek)
    Select Case day
        Case DayOfWeek.Monday
            Console.WriteLine("Today is Monday!")
        Case DayOfWeek.Tuesday
            Console.WriteLine("Today is Tuesday!")
        Case DayOfWeek.Wednesday
            Console.WriteLine("Today is Wednesday!")
        Case DayOfWeek.Thursday
            Console.WriteLine("Today is Thursday!")
        Case DayOfWeek.Friday
            Console.WriteLine("Today is Friday!")
        Case DayOfWeek.Saturday
            Console.WriteLine("Today is Saturday!")
        Case DayOfWeek.Sunday
            Console.WriteLine("Today is Sunday!")
    End Select
End Sub

CA1501: Übermäßige Vererbung vermeiden.

Siehe auch