2009-04-14 17 views
6

Sono un programmatore C# che è obbligato a utilizzare VB (eh !!!!). Voglio controllare molteplici Stato controlli in un metodo, in C# questo sarebbe stata compiuta in questo modo:Casting in visual basic?

if (((CheckBox)sender).Checked == true) 
{ 
    // Do something... 
} 
else 
{ 
    // Do something else... 
} 

Così come posso fare questo in VB?

+0

L'esperienza più ricevo in VB meno mi ritrovo colata controlli in questo modo. So che non è quello che hai chiesto ma potresti semplicemente: Se Me.CheckBoxOfMine.Checked Then ... – rvarcher

+2

@rvarcher: Personalmente non mi piace VB, spero di non avere molta esperienza in esso. Senza offesa, solo la mia opinione. – Kredns

risposta

15

C#:

(CheckBox)sender 

VB:

CType(sender, CheckBox) 
+0

Giusto per chiarire è Ctype è equivalente IL di (int) x boxing? o DirectCast. Pensavo che DirectCast fosse esattamente l'equivalente di questo. –

+0

Questo lancio non è equivalente. La versione VB è in realtà un cast lessicale, non un cast CLR. – JaredPar

+0

Il cast di stile C# (CheckBox) vive da qualche parte tra DirectCast e CType(). DirectCast è _more_ strict, CType è più vicino (non uguale a) a Convert.To ____() –

2

Adam Robinson è corretta, anche DirectCast è a vostra disposizione.

+0

Giusto. Tuttavia, CType è generalmente più analogo, poiché il casting in C# utilizzerà le conversioni esplicite finché l'oggetto target è nel contesto di un tipo convertibile (cioè, non come un semplice "oggetto"). DirectCast non utilizzerà le conversioni, ma CType lo farà. –

+0

Ottimo punto. –

10

VB ha in realtà 2 nozioni di casting.

  1. stile CLR fusione
  2. lessicale Casting

stile CLR casting è ciò che un utente # C è più familiarità con. Questo utilizza il sistema di tipo CLR e le conversioni per eseguire il cast. VB ha DirectCast e TryCast equivalenti al cast di C# e come operatore rispettivamente.

I cast lessicali in VB fanno un lavoro extra in aggiunta al sistema di tipo CLR. In realtà rappresentano un superset di potenziali cast. I cast lessicali sono facilmente individuabili cercando il prefisso C sull'operatore di cast: CType, CInt, CString, ecc. Questi cast, se non direttamente conosciuti dal compilatore, passeranno attraverso il tempo di esecuzione VB. Il tempo di esecuzione farà interpretazione sulla parte superiore del sistema di tipo per consentire calchi come il seguente a lavorare

Dim v1 = CType("1", Integer) 
Dim v2 = CBool("1") 
+0

MSDN sembra differire da te, poiché DirectCast richiede l'equivalenza di tipo (o ereditarietà). CType richiede il controllo in fase di compilazione, in base a http://msdn.microsoft.com/en-us/library/4x2877xb(VS.80).aspx. Il runtime non è coinvolto. –

+2

@Adam, la documentazione non è corretta. CType può essere una conversione lessicale e coinvolge il runtime VB. Prova il seguente "Dim b as Integer = CType (" 42 ", Integer)". Questo esegue e coinvolge il runtime VB – JaredPar

2

DirectCast eseguirà la conversione al momento della compilazione, ma può essere utilizzato solo per lanciare tipi di riferimento. Ctype eseguirà la conversione in fase di esecuzione (più lento della conversione in fase di compilazione) ma è ovviamente utile per convertire i tipi di valore. Nel tuo caso "mittente" è un tipo di riferimento, quindi DirectCast sarebbe la strada da percorrere.

+0

Un buon punto per citare Directcast, in quanto può essere più veloce ... –

0

La trasmissione in VB.net utilizza la parola chiave ctype. Quindi l'istruzione C# (CheckBox)sender equivale a ctype(sender,CheckBox) in VB.net.

Pertanto il codice in VB.net è:

if ctype(sender,CheckBox).Checked =True Then 
    ' Do something... 
else 
    ' Do something else... 
End If 
Problemi correlati