SonarSource Rules
  • Products

    In-IDE

    Code Quality and Security in your IDE with SonarQube Ide

    IDE extension that lets you fix coding issues before they exist!

    Discover SonarQube for IDE

    SaaS

    Code Quality and Security in the cloud with SonarQube Cloud

    Setup is effortless and analysis is automatic for most languages

    Discover SonarQube Cloud

    Self-Hosted

    Code Quality and Security Self-Hosted with SonarQube Server

    Fast, accurate analysis; enterprise scalability

    Discover SonarQube Server
  • SecretsSecrets
  • ABAPABAP
  • AnsibleAnsible
  • ApexApex
  • AzureResourceManagerAzureResourceManager
  • CC
  • C#C#
  • C++C++
  • CloudFormationCloudFormation
  • COBOLCOBOL
  • CSSCSS
  • DartDart
  • DockerDocker
  • FlexFlex
  • GitHub ActionsGitHub Actions
  • GoGo
  • HTMLHTML
  • JavaJava
  • JavaScriptJavaScript
  • JSONJSON
  • JCLJCL
  • KotlinKotlin
  • KubernetesKubernetes
  • Objective CObjective C
  • PHPPHP
  • PL/IPL/I
  • PL/SQLPL/SQL
  • PythonPython
  • RPGRPG
  • RubyRuby
  • RustRust
  • ScalaScala
  • SwiftSwift
  • TerraformTerraform
  • TextText
  • TypeScriptTypeScript
  • T-SQLT-SQL
  • VB.NETVB.NET
  • VB6VB6
  • XMLXML
  • YAMLYAML
C#

C# static code analysis

Unique rules to find Bugs, Vulnerabilities, Security Hotspots, and Code Smells in your C# code

  • All rules 493
  • Vulnerability46
  • Bug88
  • Security Hotspot24
  • Code Smell335

  • Quick Fix 61
Filtered: 30 rules found
performance
    Impact
      Clean code attribute
        1. API Controllers should derive from ControllerBase instead of Controller

           Code Smell
        2. "string.Create" should be used instead of "FormattableString"

           Code Smell
        3. "Contains" should be used instead of "Any" for simple equality checks

           Code Smell
        4. "First" and "Last" properties of "LinkedList" should be used instead of the "First()" and "Last()" extension methods

           Code Smell
        5. The lambda parameter should be used instead of capturing arguments in "ConcurrentDictionary" methods

           Code Smell
        6. "StartsWith" and "EndsWith" overloads that take a "char" should be used instead of the ones that take a "string"

           Code Smell
        7. "Min/Max" properties of "Set" types should be used instead of the "Enumerable" extension methods

           Code Smell
        8. Prefer indexing instead of "Enumerable" methods on types implementing "IList"

           Code Smell
        9. The collection should be filtered before sorting by using "Where" before "OrderBy"

           Code Smell
        10. Collection-specific "Exists" method should be used instead of the "Any" extension

           Code Smell
        11. The collection-specific "TrueForAll" method should be used instead of the "All" extension

           Code Smell
        12. "Find" method should be used instead of the "FirstOrDefault" extension

           Code Smell
        13. Start index should be used instead of calling Substring

           Code Smell
        14. Non-abstract attributes should be sealed

           Code Smell
        15. Assemblies should be marked with "NeutralResourcesLanguageAttribute"

           Code Smell
        16. "static readonly" constants should be "const" instead

           Code Smell
        17. "Assembly.GetExecutingAssembly" should not be called

           Code Smell
        18. Value types should implement "IEquatable<T>"

           Code Smell
        19. Finalizers should not be empty

           Code Smell
        20. Unchanged variables should be marked as "const"

           Code Smell
        21. Non-derived "private" classes and records should be "sealed"

           Code Smell
        22. Duplicate casts should not be made

           Code Smell
        23. "ConfigureAwait(false)" should be used

           Code Smell
        24. Multiple "OrderBy" calls should not be used

           Code Smell
        25. "StringBuilder" data should be used

           Code Smell
        26. Logging templates should be constant

           Code Smell
        27. Properties should not make collection or array copies

           Code Smell
        28. Strings should not be concatenated using '+' in a loop

           Code Smell
        29. "GC.Collect" should not be called

           Code Smell
        30. "Any()" should be used to test for emptiness

           Code Smell

        The lambda parameter should be used instead of capturing arguments in "ConcurrentDictionary" methods

        intentionality - efficient
        maintainability
        Code Smell
        • performance

        Why is this an issue?

        How can I fix it?

        More Info

        When using the ConcurrentDictionary, there are many overloads of the GetOrAdd and AddOrUpdate methods that take both a TKey argument and a lambda that expects a TKey parameter. This means that the right side of the lambda can be written using either the lambda’s parameter or the method’s argument. However, using the method’s argument leads to the lambda capturing it, and the compiler will need to generate a class and instantiate it before the call. This means memory allocations, as well as more time spend during Garbage Collection.

        What is the potential impact?

        We measured a significant improvement both in execution time and memory allocation. For more details see the Benchmarks section from the More info tab.

          Available In:
        • SonarQube IdeCatch issues on the fly,
          in your IDE
        • SonarQube CloudDetect issues in your GitHub, Azure DevOps Services, Bitbucket Cloud, GitLab repositories
        • SonarQube Community BuildAnalyze code in your
          on-premise CI
          Available Since
          10.1
        • SonarQube ServerAnalyze code in your
          on-premise CI
          Developer Edition
          Available Since
          10.1

        © 2008-2025 SonarSource SA. All rights reserved.

        Privacy Policy | Cookie Policy | Terms of Use