2013-09-06 15 views
10

Questo non è davvero un problema, ma più di una curiosità che in me non sono stato in grado di risolvere dai miei propri mezzi. Sicuramente non perderò il sonno.Omettendo "Case" da "Seleziona ... Case" Dichiarazione

In VB.NET, la sintassi di istruzione switch è (come documentato su MSDN here):

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

Si noti che nella prima riga, Case è tra parentesi quadre, che significa che è facoltativa.

E infatti, il seguente esempio compila ed esegue nello stesso modo, come se la parola Case era stato incluso, almeno, negli esempi rudimentali ho provato:

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

Quindi la mia domanda è come segue: a parte la sintassi, c'è qualsiasi differenza tra l'apertura di uno switch con Select e Select Case?

+0

Nessuno a cui possa pensare. Se 'MSDN' non menziona nulla si potrebbe presumere che non lo faccia. Detesto assumere ... – OneFineDay

+0

domanda interessante, scommetto che "CASE" è facoltativo poiché sembra allineare con una dichiarazione di interruttore C# senza esso comunque (Forse la parte "CASE" è solo un riporto dal vecchio vb), e che probabilmente si compila allo stesso modo in CLR –

+1

Un altro aspetto interessante è che anche se, secondo MSDN, il 'Case' è opzionale, se lo si lascia fuori, Visual Studio lo aggiunge automaticamente per te. –

risposta

6

ho fatto un piccolo esperimento. Ho fatto una piccola applicazione console in questo modo:

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 

La prima esecuzione fu come nella foto sopra, e poi ho compilato nuovamente inserendo la parola chiave Case.Ho smontato entrambi eseguibili creati usando ILDasm e incollato l'IL della funzione GetString in questo sito diff on-line: http://www.diffchecker.com/9ef7z423

mi sembra Select Case e pianura vecchio Select sono differenze puramente di sintassi (questo è naturalmente escludendo l'utilizzo di Select in Query LINQ).

+0

Ovviamente, se ti manca qualche sfumatura sottile sulla lingua (non penso che tu sia, come indica la mia risposta), potresti aver compilato una circostanza in cui la sfumatura non è stata esposta. Cioè se ** ha fatto ** fare la differenza, potrebbe essere un caso limite che il tuo esempio non usa. –

+0

A livello di programmazione, VB.Net aggiunge automaticamente il 'caso' per te durante l'esecuzione. Quindi sicuramente avrai la stessa risposta. –

2

Direi che c'è no differenza tra le due forme. Tuttavia, la mia unica prova è l'assenza di distinzione. Piuttosto che guardare riferimenti del linguaggio, il luogo definitivo per cercare è nella Language Specification .

nella versione 11, ai sensi della sezione 10.8.2, l'istruzione Select Case è discusso, e la sintassi indicato è:

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

Quindi, è chiaro che questa sezione non copre entrambe le forme. Tuttavia, nei precedenti 5 paragrafi (l'interezza della specifica per Select Case Statements) non viene fatta alcuna distinzione tra le due forme.

Il riferimento cerca di essere descrittivo, dare esempi, e gli usi (a volte) la lingua più flessibile. La specifica dovrebbe essere seguita per creare un compilatore di Visual Basic. Se manca qualcosa del primo, potrebbe essere solo un'omissione. Se manca qualcosa da quest'ultimo, allora non è ufficialmente parte della lingua.

0

forse è solo una differenza di sintassi, in termini di tra le lingue, come ad esempio VB e C#

un'istruzione switch richiede la parola pausa al fine di rompere fuori dal giro.

Non riesco a pensare a qualcosa di importante, in termini di differenze ... mi dispiace.

1

Penso che questo provenga da VB 6.0 dove Select Case era obbligatorio - Select non era un'istruzione a parte. Ciò significherebbe che ora si tratta solo di preferenze personali in VB.NET.

Edit: Stranamente, se si sceglie di omettere, Visual Studio aggiungerà automaticamente.