2009-04-14 21 views
6

Soy un programador de C# que se ve obligado a utilizar VB (¡eh !!!!). Quiero comprobar el estado de múltiples controles en un método, en C# esto se llevaría a cabo de esta manera:¿Casting en Visual Basic?

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

Entonces, ¿cómo puedo lograr esto en VB?

+0

El más experiencia tengo en VB al menos me encuentro fundición controles como se muestra. Sé que no es lo que pediste, pero podrías simplemente: Si Me.CheckBoxOfMine.Checked Then ... – rvarcher

+2

@rvarcher: Personalmente no me gusta VB, espero no tener mucha experiencia en ello. Sin ofender, solo mi opinión. – Kredns

Respuesta

15

C#:

(CheckBox)sender 

VB:

CType(sender, CheckBox) 
+0

Solo para aclarar ¿Ctype es IL equivalente a (int) x boxeo? o DirectCast. Pensé que DirectCast es el equivalente exacto de esto. –

+0

Estos moldes no son equivalentes. La versión VB es en realidad un elenco léxico, no un elenco CLR. – JaredPar

+0

El modelo de estilo C# (CheckBox) vive en algún lugar entre DirectCast y CType(). DirectCast es _more_ estricto, CType está más cerca (no es lo mismo que) de Convert.To ____() –

2

Adam Robinson es correcta, también DirectCast está disponible para usted.

+0

Derecha. Sin embargo, CType es generalmente más análogo, ya que la conversión en C# usará conversiones explícitas siempre que tengas el objeto de destino en el contexto de un tipo convertible (es decir, no solo como "objeto"). DirectCast no usará conversiones, pero CType lo hará. –

+0

Muy buen punto. –

10

VB en realidad tiene 2 nociones de fundición.

  1. estilo CLR colada
  2. Fundición léxico

fundición de estilo CLR es lo que un usuario C# es más familiarizado. Utiliza el sistema de tipo CLR y las conversiones para realizar el reparto. VB tiene DirectCast y TryCast equivalentes al lanzamiento de C# y como operador respectivamente.

Los moldes léxicos en VB hacen un trabajo extra además del sistema de tipo CLR. En realidad representan un superconjunto de moldes potenciales. Los moldes léxicos se detectan fácilmente buscando el prefijo C en el operador de reparto: CType, CInt, CString, etc ... Estos lanzamientos, si no son conocidos directamente por el compilador, pasarán por el tiempo de ejecución de VB. El tiempo de ejecución hará interpretación en la parte superior del sistema de tipos para permitir lanza como los siguientes para

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

Parece que MSDN difiere de usted en esto, ya que DirectCast requiere equivalencia de tipo (o herencia). CType requiere verificación en tiempo de compilación, de acuerdo con http://msdn.microsoft.com/en-us/library/4x2877xb(VS.80).aspx. El tiempo de ejecución no está involucrado. –

+2

@ Adam, la documentación es incorrecta. CType puede ser una conversión léxica y implica el tiempo de ejecución de VB. Pruebe lo siguiente "Dim b como Integer = CType (" 42 ", Entero)". Esto se ejecuta e implica el tiempo de ejecución de VB. – JaredPar

2

DirectCast llevará a cabo la conversión en tiempo de compilación, pero sólo puede ser utilizada para convertir los tipos de referencia. Ctype realizará la conversión en tiempo de ejecución (más lenta que la conversión en tiempo de compilación), pero obviamente es útil para convertir tipos de valores. En su caso, "remitente" es un tipo de referencia, por lo que DirectCast sería el camino a seguir.

+0

. Buen punto para mencionar Directcast, ya que puede ser más rápido ... –

0

Fundición en VB.net utiliza la palabra clave ctype. Por lo tanto, la sentencia C# (CheckBox)sender es equivalente a ctype(sender,CheckBox) en VB.net.

lo tanto, su código en VB.net es:

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