Változó típus kikövetkeztetéssel lehet lokális változókat deklarálni úgy hogy nem adjuk meg a típust, de ez csak akkor használható ha a változó típusa meghatározható a kontextusból. Például:
Ez megegyezik ezzel:
A típus kikövetkeztetést lehet alkalmazni alap típusokra nem csak osztályokra. Például:
Ilyenkor a lehető legszűkebb típus lesz a változó típusa, például: integer nem longint. Csak a lokális és az inline változóknál lehet használni a típus kikövetkeztetést.
Név | Méret | Előjel | Tartomány |
---|---|---|---|
ShortInt | 1 bájt | előjeles | -128...127 |
SmallInt | 2 bájt | előjeles | -32768...32767 |
Integer | 4 bájt | előjeles | -2147483648...2147483647 |
LongInt | 4 bájt | előjeles | -2147483648...2147483647 |
Int64 | 8 bájt | előjeles | -9223372036854775808 .. 9223372036854775807 |
Byte | 1 bájt | előjel nélküli | 0...255 |
Word | 2 bájt | előjel nélküli | 0...65535 |
LongWord, Cardinal | 4 bájt | előjel nélküli | 0..4294967295 |
Név | Méret | Tartomány |
---|---|---|
Single | 4 bájt | -1.5E-45...3.4E38 |
Real, Double, Extend | 8 bájt | -5.0E-324...1.7E308 |
Név | Méret | Tartomány |
---|---|---|
WideChar, Char | 2 bájt | Unicode |
Megegyezik a .NET System.Strings osztályával
Név | Méret | Tartomány |
---|---|---|
Boolean | 1 bájt | 0, 1, False, True |
Mint a többi .NET alapú nyelvek többsége Oxygene is támogatja az úgy nevezett nembiztonságos kódot (unsafe code), amely első sorban mutatók használatát jelenti, azaz a típusellenőrzés gyengítését. Annak ellenére, hogy a szigorú típusellenőrzés növeli a kód biztonságát, némely esetben sokkal nagyobb teljesítmény érhető el mutatók használatával.
Pascal nyelv biztosít lehetőséget mutatók használatára, ezek Oxygen-ben is használhatóak, de ahhoz hogy ezeket használjuk ezt explicit módon meg kell engedni a projekt beállításaiban (Ezen kívül nembiztonságos kódot használó elem deklarációban is explicit módon kell jelölni ezt a szándékot).
Szintaxis:
Minden változónak vagy egy alapértelmezett értéke, amire inicializálódik, ha nem adtunk neki értéket. Azonban a nullable kulcsszó használatával elérhetjük, hogy az értéket ne az alapértékre inicializálja hanem nil-re. Ez a kulcsszó csupán kellemesebb reprezentációja .NET egyik generikus osztályának, Nullable<T>-nek. Azaz nullable Integer i; ekvivalens Nullable<Integer> i;-vel, de feltételezhetően könnyebben használható.
Ennek a típusnak az előnye, hogy könnyen ellenőrizni tudjuk, hogy egy változó kapott-e már értéket. Pl.:
Nullable osztályok kényelmesebb használata érdekében Oxygene egy új operátor vezetett be, az úgy nevezett kettőspont-operátort (colon operator), aminek a működése részben megegyezik (.) operátor működésével azzal a különbséggel, hogy ha eredetileg érintett metódus/tag érték típussal tért vissza, akkor (:) operátor használata esetén Nullable<eredeti típus> lesz a visszatérési érték típusa. Ezzel a módosítással (:) operátor Nil-ra inicializált objektumokra is használható úgy, hogy ha objektum Nil, akkor a metódus meghívása nem kivételt eredményez, hanem Nil-lal tér vissza. Pl.:
A nyelvben lehetőségünk van névtelen osztályokat deklarálni egy metodus törzsében. Például:
Itt osztály tagjainak típusát fordító a nekik adott értékekből következteti ki, de tagok típusa explicit módon is megadható. Az előző példa ekvivalens a következővel:
Anonim osztályok tagjainak nevei az inicializáló értékükkel is megadható, például ha más osztály tagjaival inicializáljuk:
Ez a kód olyan anonim osztályt hoz létre, melynek két adattagja van: Name és Value, és a típusuk megegyezik a Data osztály megfelelő adattagjainak a típusával.
Ezek olyan típusok amelyek figyelembe veszik másik típusok tagjait (általában osztályokét vagy rekordokét). A "nasted in" kulcsszóval kell definiálni és utána kell írni a szülő típust. Például:
Delegate típusú objektumok nem mások, mint a függvények és metódusok mutatói. Biztonságosan használhatóak dinamikus függvények és metódusok meghívására. .NET-ben delegate típusú objektumokat eseményekkel kombinálva használják úgy, hogy egy eseményhez egy vagy több delegate hozzárendelhető.
Az Oxygene nyelvben egy delegate 4 kulcsszóval is deklarálható: function, procedure, method és delegate.
Egy delegált függvény vagy metódus meghívható delegate specifikus metódusok segítségével (BeginInvoke és EndInvoke), de kifejezésként is használhatjuk őket. Pl.:
Az enum vagy a flag kulcsszó és a felsorolás neve után kapcsos zárójelben soroljuk fel az értékeket. A flags abban különbözik az enum-tól, hogy a felsorolási típus értékei nem 0,1,2... lesz hanem a kettes számrendszer számait kapják értékül 1,2,4,8,16... Például:
A név után opcionálisan megadható a felsorolás típusa (pl: hogy kisebb helyet foglaljon), de ez a típus csak beépített típus lehet, azaz Byte, Sbyte, Int16, Int32, Int64, Uint16, Uint32, Uint64, Char típusok egyike. Illetve az egyes elemekhez rendelt érték.
A halmaz típus bír annak a szokásos műveleteivel: in(tartalmazás), +(unió), -(differencia), *(metszet), illetve lehet halmazok egyenlőségét lekérdezni(=), és van halmazok közti <=(részhalmaz), >=(részhalmaz), <>(nem egyenlő) műveletek. A halmaz értékeinek 0-nál nagyobbnak kell lennie! Egy halmazban tárolt elem maximális értéke 0x100000 lehet (azaz 128 kbit-nél nem foglalhat többet egy érték a memóriából). Példa:
Szükség esetén halmaztípus felsorolási típusból is létrehozható:
Egy halmaz érték szerint adódik át paraméterben és következő a szintaxisa:
A tömb inicializálódik, ha eleget tesz a következő 3 szabálynak:
Dinamikus (unbound) tömbök.
.NET más nyelveihez hasonlóan tömb mérete értékhez van kötve, nem a típusához. Pl.:
Kötött (bound) tömbök.
Oxygen-ben lehetőség van a tömbök méreteinek előredefiniálásra. Előre definiált tömbök a kötött tömbök. Pl.:
Megjegyzés: Nem csak egész típusokat használhatjuk tömb határainak definiálásra, hanem karakter- és felsorolási típusokat is használhatjuk.
Konstans inline tömbök.
Konstans tömbök anélkül is használhatóak, hogy kézzel definiáljuk őket. Pl.:
Statikus tömbök.
Referencia szerint adódnak át paraméterben. Pl.:
Inline tömbök. Nemkonstans inline tömbök csak nembiztonságos kódban (unsafe code) használhatóak.
Nem csak váltózók gyűjteménye mint object pascalban hanem lehetnek benne eljárások is. Az osztályokhoz hasonlóan a rekordok változóinak és metódusainak is lehet megadni láthatóságot (alapértelmezésben: assembly). Szintén az osztályokhoz hasonló tulajdonsága, hogy egy vagy több interfészt is megvalósíthat. Egyetlen eltérés az osztályoktól az, hogy a rekordokból nem származhat más rekord vagy osztály. Például:
Alapértelmezetten .NET dönti el, hogy a rekord mezői hogy helyezkednek el a memóriában, így több helyet foglalhatnak, mint a bennük foglalt mezőknek szükséges. StructLayout attribútum segítségével a rekord eltárolásra szükséges hely minimalizálható. Pl.:
A példában megmutatott rekord mérete 5 bájt, de ha eltávolítjuk a StructLayout attribútumot, akkor 8 bájt.
Megjegyzés. .NET nem támogat üres rekordokat, így a következő kód hibásnak számít:
Ha mégis szükség van rá (például verem-alapú nembiztonságos tömb megvalósításához), akkor implicit méret megadásával mégis definiálható az üres tömb:
Ha egy rekord nem tartalmaz mezőket, csak metódusokat, akkor üresnek számít és előbb említett attribútum szükséges a deklarálásához.
Viselkedését és lehetőségeit tekintve megfelel a Java és a C# megközelítésének. Részletesebben erről az Objektum-elvű programozás fejezetben lesz szó. Az osztály referencia típus, melynek adattagok, konstruktorok, destruktorok, metódusok, konstansok, propertik, operátorok, indexerek, osztály adattagok lehetnek a deklarációs részében.