Konvertálások szélesítése és szűkítése (Visual Basic)
A típuskonverzió fontos szempontja, hogy az átalakítás eredménye a céladattípus tartományán belül van-e.
A szélesítő átalakítás olyan adattípusra módosítja az értéket, amely lehetővé teszi az eredeti adatok bármely lehetséges értékét. A konvertálások bővítése megőrzi a forrásértéket, de megváltoztathatja annak megjelenítését. Ez akkor fordul elő, ha az integrál típusból Decimal
az , vagy a Char
helyről a másikra String
konvertál.
A szűkülő átalakítás olyan adattípusra módosítja az értéket, amely nem biztos, hogy képes tárolni a lehetséges értékek egy részét. A törtértékek például kerekítve lesznek, amikor az egész típussá alakul át, és a konvertálandó Boolean
numerikus típusok egyikére True
vagy False
a másikra lesznek csökkentve.
Átalakítások szélesedése
Az alábbi táblázat a szabványos szélesítési konverziókat mutatja be.
Adattípus | Szélesítés adattípusokra 1 |
---|---|
SByte | SByte , Short , Integer , Long Decimal , Single Double |
Bájt | Byte , Short , UShort , Integer , UInteger Long , ULong , Decimal , , Single Double |
Rövid | Short , Integer , Long , Decimal Single Double |
UShort | UShort , Integer , UInteger , Long ULong , Decimal , Single Double |
Egész | Integer , Long , Decimal , Single Double 2 |
UInteger | UInteger , Long , ULong , Decimal Double Single 2 |
Hosszú | Long , Decimal , Single Double 2 |
ULong | ULong , Decimal , Single Double 2 |
Decimális | Decimal , Single , Double 2 |
Egyetlen | Single , Double |
Dupla | Double |
Tetszőleges számbavételi típus (Enum) | Mögöttes integráltípusa és bármely olyan típus, amelyre az alapul szolgáló típus szélesedik. |
Char | Char , String |
Char Tömb |
Char Tömb String |
Bármilyen típus | Objektum |
Bármilyen származtatott típus | Bármely alaptípus, amelyből származik 3. |
Bármilyen típus | Bármilyen felület, amit implementál. |
Semmi | Bármilyen adattípus vagy objektumtípus. |
1 Definíció szerint minden adattípus önmagára szélesedik.
2. A , UInteger
, , ULong
Long
vagy Decimal
a Single
Double
-ból Integer
való átalakítások pontosságvesztést eredményezhetnek, de soha nem veszítik el a pontosságot. Ebben az értelemben nem okoznak adatvesztést.
3 Meglepőnek tűnhet, hogy a származtatott típusból az egyik alaptípusba való átalakítás szélesedik. Az indoklás az, hogy a származtatott típus az alaptípus összes tagját tartalmazza, ezért az alaptípus példányának minősül. Ellenkező irányban az alaptípus nem tartalmaz a származtatott típus által definiált új tagokat.
A konvertálások bővítése mindig sikeres futásidőben, és soha nem jár adatvesztéssel. Ezeket mindig implicit módon hajthatja végre, függetlenül attól, hogy az Option Strict Utasítás a típus-ellenőrző kapcsolót a következőre On
Off
állítja be.
Konverziók szűkítése
A szabványos szűkítési átalakítások a következők:
Az előző táblázatban szereplő szélesítési konverziók fordított irányai (kivéve, hogy minden típus önmagára szélesít)
Konvertálások bármelyik irányban logikai és numerikus típus között
Konvertálás bármilyen numerikus típusból bármely számba sorolt típusra (
Enum
)Átalakítások a sztring és bármely numerikus típus közötti irányban,
Boolean
vagy dátumAdattípusból vagy objektumtípusból az abból származtatott típusra történő konvertálás
A konvertálások szűkítése nem mindig sikerül futásidőben, és meghiúsulhat vagy adatvesztést okozhat. Hiba történik, ha a céladattípus nem tudja fogadni a konvertált értéket. Egy numerikus átalakítás például túlcsordulást eredményezhet. A fordító nem teszi lehetővé a szűkítő konverziók implicit végrehajtását, hacsak az Option Strict Utasítás nem állítja be a típus-ellenőrző kapcsolót Off
.
Feljegyzés
A szűkítés-konverziós hiba el lesz tiltva a gyűjtemény elemeiből For Each…Next
a ciklusvezérlő változóba való konvertáláskor. További információkért és példákért tekintse meg a "Konvertálások szűkítése" szakaszt az Egyes... Következő utasítás.
Mikor érdemes szűkítési konverziókat használni?
Szűkítő konverziót akkor használ, ha tudja, hogy a forrásérték hiba vagy adatvesztés nélkül konvertálható a cél adattípusra. Ha például olyan String
van, amelyről tudja, hogy "True" vagy "False" (Igaz) vagy "False" (Hamis) értéket tartalmaz, a CBool
kulcsszóval átalakíthatja azt Boolean
.
Kivételek az átalakítás során
Mivel a konvertálások bővítése mindig sikeres, nem kivételeket eredményeznek. A konvertálások szűkítése, ha sikertelenek, leggyakrabban a következő kivételeket alkalmazzák:
InvalidCastException — ha a két típus között nincs átalakítás meghatározva
OverflowException — (csak integráltípusok esetén), ha az átalakított érték túl nagy a céltípushoz
Ha egy osztály vagy struktúra olyan CType-függvényt határoz meg, amely átalakító operátorként szolgál az adott osztály vagy struktúra felé vagy onnan, amely CType
bármilyen, megfelelőnek ítélt kivételt okozhat. CType
Emellett a Visual Basic függvényeket vagy .NET-keretrendszer metódusokat is meghívhatja, amelyek azonban számos kivételt okozhatnak.
Változások referenciatípus-átalakítások során
Egy referenciatípusból való átalakítás csak a mutatót másolja az értékre. Maga az érték semmilyen módon nem másolható és nem módosítható. Az egyetlen dolog, ami módosítható, az a mutatót tartalmazó változó adattípusa. Az alábbi példában az adattípus a származtatott osztályból az alaposztályba lesz konvertálva, de az objektum, amelyre mindkét változó mutat, változatlan.
' Assume class cSquare inherits from class cShape.
Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: