2013-09-06 16 views
10

Das ist nicht wirklich ein Problem, sondern eher eine meiner Neugier, die ich nicht mit eigenen Mitteln lösen konnte. Ich werde sicherlich keinen Schlaf darüber verlieren."Case" aus "Select ... Case" auslassen

In VB.NET, die switch-Anweisung Syntax ist (wie auf MSDN dokumentiert here):

Select [ Case ] testexpression 
[ Case expressionlist 
    [ statements ] ] 
[ Case Else 
    [ elsestatements ] ] 
End Select 

Beachten Sie, dass in der ersten Zeile, Case in eckigen Klammern ist, was bedeutet, dass es optional ist.

Und in der Tat, das folgende Beispiel kompiliert und ausgeführt in der gleichen Art und Weise, als ob das Case Schlüsselwort enthalten war, zumindest in den rudimentären Beispielen, die ich versucht habe:

Select myIntVar 
    Case 0 
     Return "Nothing" 
    Case 1 
     Return "Just one" 
    Case Else 
     Return "Something else" 
End Select 

Daher meine Frage ist, wie follows: Abgesehen von Syntax, gibt es beliebig Unterschied zwischen dem Öffnen einer Switch-Anweisung mit Select und Select Case?

+0

Keine, die ich mir vorstellen kann. Wenn "MSDN" nichts erwähnt, könnte man annehmen, dass dies nicht der Fall ist. Ich hasse es anzunehmen ... – OneFineDay

+0

interessante Frage, ich wette, dass "CASE" optional ist, da es scheint mit einer C# switch-Anweisung ohne es sowieso auszurichten (Vielleicht ist der "CASE" Teil nur ein Übertrag von alten Vb), und Es ist wahrscheinlich, dass es in CLR –

+1

auf die gleiche Weise kompiliert. Ein weiterer interessanter Aspekt ist, dass, obwohl das "Case" laut MSDN optional ist, Visual Studio es automatisch für Sie hinzufügt, wenn Sie es auslassen. –

Antwort

6

Ich habe ein kleines Experiment gemacht. Ich habe wie so eine kleine Konsolenanwendung auf:

Module Module1 

    Sub Main() 
     Dim myStr As String = GetString(1) 
    End Sub 

    Private Function GetString(myIntVar) As String 
     Select myIntVar 
      Case 0 
       Return "Nothing" 
      Case 1 
       Return "Just one" 
      Case Else 
       Return "Something else" 
     End Select 
    End Function 

End Module 

Der erste Lauf wie oben abgebildet war, und ich es dann erneut kompiliert das Case Schlüsselwort einfügen.Ich zerlegt beide erstellt ausführbare ILDasm und klebte die IL der GetString Funktion in diese Online-diff Website mit: http://www.diffchecker.com/9ef7z423

ich Sieht aus wie Select Case und einfache alten Select rein Syntax Unterschiede sind (dies ist natürlich ohne die Verwendung von Select in LINQ-Abfragen).

+0

Natürlich, wenn Sie einige subtile Nuancen über die Sprache vermissen würden (ich glaube nicht, dass Sie es sind, wie meine Antwort zeigt), könnten Sie in einem Umstand kompiliert haben, wo die Nuance nicht aufgedeckt wurde. I.e. Wenn es ** einen Unterschied macht, könnte es ein Randfall sein, den Ihr Beispiel nicht verwendet. –

+0

Programmgesteuert fügt VB.Net automatisch das 'Case' für Sie hinzu. Auf jeden Fall wirst du die gleiche Antwort haben. –

2

Ich würde sagen, es gibt keine Unterschied zwischen den beiden Formen. Mein einziger Beweis ist jedoch, dass ich keine Unterscheidung mache. Anstatt auf die Sprachreferenz zu schauen, ist der definitive Ort zu suchen in der Language Specification .

In Version 11 unter Abschnitt 10.8.2 wird die Select Case-Anweisung diskutiert, und die Syntax dargestellt ist:

Select :: =
Select [Case] ExpressionStatementTerminator
[CaseStatement +]
[CaseElseStatemen t]
End SelectStatementTerminator

Also, es ist klar, dass dieser Abschnitt beiden Formen abdeckt. In den vorhergehenden 5 Absätzen (die gesamte Spezifikation für Select Case Statements) wird jedoch nicht zwischen den beiden Formen unterschieden.

Die Referenz versucht beschreibend zu sein, gibt Beispiele und verwendet (manchmal) eine losere Sprache. Die Spezifikation sollte folgen, um einen Visual Basic-Compiler zu erstellen. Wenn etwas von dem ersten fehlt, dann kann es nur eine Unterlassung sein. Wenn etwas von letzterem fehlt, dann ist es nicht offiziell Teil der Sprache.

0

Vielleicht ist es nur ein Unterschied in der Syntax, in Bezug auf die zwischen Sprachen wie VB und C#

eine switch-Anweisung das Schlüsselwort Pause benötigt, um aus der Schleife zu brechen.

Ich kann an nichts Großes denken, in Bezug auf die Unterschiede ... sorry.

1

Ich denke, das kommt von VB 6.0, wo Select Case obligatorisch war - Select war keine Aussage für sich. Dies würde bedeuten, dass es jetzt nur noch auf persönliche Vorlieben in VB.NET ankommt.

Bearbeiten: Seltsamerweise, wenn Sie wählen, es wegzulassen, fügt Visual Studio es automatisch hinzu.