2009-04-14 15 views
6

Ich bin ein C# -Programmierer, der gezwungen ist, VB zu benutzen (eh !!!!). Ich mag mehrere Steuerelemente Zustand in einem Verfahren überprüfen, in C# dies wie so erreicht werden würde:Casting in Visual Basic?

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

So wie kann ich dies in VB erreichen?

+0

Je mehr Erfahrung, die ich in VB erhalten je weniger ich finde mich Kontrollen wie diese werfen. Ich weiß, es ist nicht das, was Sie gefragt, aber Sie könnten nur: Wenn Me.CheckBoxOfMine.Checked Dann ... – rvarcher

+2

@ rvarcher: Ich persönlich mag nicht VB, ich hoffe, ich bekomme nicht zu viel Erfahrung darin. Nichts für ungut, nur meine Meinung. – Kredns

Antwort

15

C#:

(CheckBox)sender 

VB:

CType(sender, CheckBox) 
+0

Nur um zu klären, ist Ctype IL-Äquivalent von (int) x Boxen? oder DirectCast. Ich dachte DirectCast ist das genaue Äquivalent dazu. –

+0

Diese Modelle sind nicht gleichwertig. Die VB-Version ist eigentlich eine lexikalische Besetzung, keine CLR-Besetzung. – JaredPar

+0

Die C# (CheckBox) -Stil-Besetzung lebt irgendwo zwischen DirectCast und CType(). DirectCast ist _more_ strict, CType ist näher (nicht das gleiche) wie Convert.To ____() –

2

Adam Robinson ist richtig, auch DirectCast Ihnen zur Verfügung steht.

+0

Rechts. CType ist jedoch im Allgemeinen eher analog, da das Umwandeln in C# explizite Konvertierungen verwendet, solange Sie das Zielobjekt im Kontext eines konvertierbaren Typs haben (dh nicht nur als "Objekt"). DirectCast wird keine Conversions verwenden, CType jedoch. –

+0

Sehr guter Punkt. –

10

VB hat tatsächlich 2 Vorstellungen von Gießen.

  1. CLR Stil Casting
  2. Lexical Casting

CLR Stil Gießen ist, was ein C# Benutzer ist besser vertraut mit. Dies verwendet das CLR-Typsystem und die Konvertierungen, um den Cast durchzuführen. VB hat DirectCast und TryCast, die dem C# -Cast bzw. dem Operator entsprechen.

Lexikalische Umwandlungen in VB machen zusätzlich zu dem CLR-System zusätzliche Arbeit. Sie stellen tatsächlich eine Obermenge potenzieller Modelle dar. Lexikalische Umwandlungen werden leicht erkannt, indem nach dem C-Präfix im Umwandlungsoperator gesucht wird: CType, CInt, CString, etc ... Diese Umwandlungen durchlaufen, wenn sie dem Compiler nicht direkt bekannt sind, die VB-Laufzeit. Die Laufzeit wird tun Interpretation auf dem Typsystem Abgüsse wie die folgenden ermöglichen

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

MSDN scheint sich bei Ihnen zu unterscheiden, da DirectCast Typäquivalenz (oder Vererbung) erfordert. CType erfordert eine Überprüfung der Kompilierungszeit gemäß http://msdn.microsoft.com/en-us/library/4x2877xb(VS.80).aspx. Die Laufzeit ist nicht beteiligt. –

+2

@Adam, Die Dokumentation ist nicht korrekt. CType kann eine lexikalische Konvertierung sein und bezieht die VB-Laufzeit ein. Versuchen Sie Folgendes "Dim b als Integer = CType (" 42 ", Integer)". Dies läuft und beinhaltet die VB-Laufzeit – JaredPar

2

Direct arbeiten wird die Umwandlung bei der Kompilierung durchführen kann aber nur verwendet werden, Referenztypen zu werfen. Ctype führt die Konvertierung zur Laufzeit durch (langsamer als zum Zeitpunkt der Kompilierung), ist aber offensichtlich nützlich, um Werttypen zu konvertieren. In Ihrem Fall ist "Absender" ein Referenztyp, daher wäre DirectCast der richtige Weg.

+0

Guter Punkt zu erwähnen Directcast, wie es schneller sein kann ... –

0

Casting in VB.net verwendet das Schlüsselwort ctype. Also die C# -Anweisung (CheckBox)sender entspricht ctype(sender,CheckBox) in VB.net.

daher in VB.net Ihr Code:

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