75 lines
2.2 KiB
Plaintext
75 lines
2.2 KiB
Plaintext
== Why is this an issue?
|
|
|
|
When https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case-statement[Select Case] statements have large sets of case clauses, it is usually an attempt to map two sets of data. A https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2[Dictionary] should be used instead to make the code more readable and maintainable.
|
|
|
|
=== Exceptions
|
|
|
|
This rule ignores `Select Case` statements over `Enum` arguments and empty, fall-through cases.
|
|
|
|
== How to fix it
|
|
|
|
Store all the cases apart from the `Case Else` one in a dictionary and try to get the matching value by calling the https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2.trygetvalue[TryGetValue] method.
|
|
|
|
=== Code examples
|
|
|
|
==== Noncompliant code example
|
|
|
|
[source,vbnet,diff-id=1,diff-type=noncompliant]
|
|
----
|
|
Public Class TooManyCase
|
|
|
|
Public Function MapValues(Ch As Char) As Integer
|
|
Select Case Ch ' Noncompliant: 5 cases, "Case Else" excluded, more than maximum = 4
|
|
Case "a"c
|
|
Return 1
|
|
Case "b"c, "c"c
|
|
Return 2
|
|
Case "d"c
|
|
Return 3
|
|
Case "e"c
|
|
Return 4
|
|
Case "f"c, "g"c, "h"c
|
|
Return 5
|
|
Case Else
|
|
Return 6
|
|
End Select
|
|
End Function
|
|
|
|
End Class
|
|
----
|
|
|
|
==== Compliant solution
|
|
|
|
[source,vbnet,diff-id=1,diff-type=compliant]
|
|
----
|
|
Public Class TooManyCase
|
|
|
|
Private fMatching As New Dictionary(Of Char, Integer) From {
|
|
{ "a"c, 1 },
|
|
{ "b"c, 2 },
|
|
{ "c"c, 2 },
|
|
{ "d"c, 3 },
|
|
{ "e"c, 4 },
|
|
{ "f"c, 5 },
|
|
{ "g"c, 5 },
|
|
{ "h"c, 5 },
|
|
}
|
|
|
|
Public Function MapValues(Ch As Char) As Integer
|
|
Dim Value As Integer
|
|
If fMatching.TryGetValue(Ch, Value) Then
|
|
Return Value
|
|
Else
|
|
Return 6
|
|
End If
|
|
End Function
|
|
|
|
End Class
|
|
----
|
|
|
|
include::../resources-dotnet.adoc[]
|
|
* https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case-statement[Select...Case Statement]
|
|
|
|
|
|
include::../rspecator-dotnet.adoc[]
|