Enum on lueteltu tyyppi, jonka jokaista jäsentä vastaa numeroarvo. Sillä on hyvä esittää jonkin prosessin tilaa tai vaihtoehtoja. Enumin etu verrattuna lukuihin on tässä tapauksessa muistikuorman vähentäminen. On helpompi muistaa, että koneen ollessa käynnissä sen status on esim. MachineStatus.Started, kuin luku 1. Merkkijonoihin verrattuna etuna on myös luotettavuus. Jos samainen koneen status olisi tallessa merkkijonossa, voisi helposti tulla virheitä, joissa status on "käynissä" tms.
Esimerkiksi web-sivun sisältötyypeistä voisi tehdä seuraavanlaisen enumin:
public enum ContentType
{
Blog = 1,
Post = 11,
Comment = 111,
Forum = 2,
Thread = 21,
Reply = 211
}
Jonka jälkeen sitä voisi käyttää koodissa
// esitellään ja annetaan alkuarvo
ContentType cType = ContentType.Blog;
// Enumia voi käyttää myös switch-lauseessa
switch (cType)
{
case ContentType.Blog:
// koodia...
break;
case ContentType.Comment:
// koodia...
break;
case ContentType.Post:
// koodia...
break;
case ContentType.Forum:
// koodia...
break;
case ContentType.Thread:
// koodia...
break;
case ContentType.Reply:
// koodia...
break;
default:
// tämä suoritetaan, jos mikään edellisistä ei täsmännyt
break;
}
Enumiin ei tarvitse määritellä numeroarvoja. Oletuksena ensimmäinen saa arvon 0, toinen 1 jne. Numeroarvon voi myös antaa osalle jäseniä, jolloin seuraava jäsen saa arvon joka on edellisen arvo lisättynä yhdellä.
public enum Mode
{
ShutDown = 1,
Sleep, // saa arvon 2
Restart = 5,
SwitchUser // saa arvon 6
}
Enumin arvon voi parsia merkkijonosta ja numeroarvon saa muutettua enumiksi seuraavalla tavalla.
string typeStr = "Thread";
ContentType typeFromStr = (ContentType)Enum.Parse(typeof(ContentType), typeStr, true);
int typeInt = 111;
ContentType typeFromInt = (ContentType)typeInt;
[Flags]
public enum Sides
{
Top = 1,
Right = 2,
TopRight = 3, // Top ja Right -yhdistelmä
Bottom = 4,
Left = 8,
BottomLeft = 12 // Bottom ja Left -yhdistelmä
}
Käyttö
// voidaan valita useampi arvo "tai" -operaattorilla
Sides drawBorders = Sides.Top | Sides.Bottom;
// näin voidaan katsoa, onko arvo mukana (eli "lippu ylhäällä")
if ((drawBorders & Sides.Top) == Sides.Top)
{
Console.WriteLine("Piirrä yläreuna");
}
if ((drawBorders & Sides.Right ) == Sides.Right)
{
Console.WriteLine("Piirrä oikea reuna");
}
if ((drawBorders & Sides.Bottom) == Sides.Bottom)
{
Console.WriteLine("Piirrä alareuna");
}
if ((drawBorders & Sides.Left) == Sides.Left)
{
Console.WriteLine("Piirrä vasen reuna");
}