2010. január 8., péntek

Enum.TryParse

Tegyük fel, hogy van egy ilyen enumerációnk:

enum Fruit
{
    Apple,
    Pear,
    Grape
}

Amennyiben valahonnan egy ilyen enum értéket sztringként kaptunk meg (tehát pl. volt egy olyan sztringünk, hogy "Apple"), és azt szerettük volna a konkrét enum értékke alakítani, az Enum.Parse() statikus metódushoz fordulhattunk segítségért:

public static void ParseEnum(string fruitName)
{
    Fruit fruit = default(Fruit);
    bool parsingSuccesful;

    try
    {
        fruit = (Fruit)Enum.Parse(typeof(Fruit), fruitName);
        parsingSuccesful = true;
    }
    catch (ArgumentException)
    {
        parsingSuccesful = false;
    }

    if (parsingSuccesful)
    {
        Console.WriteLine("Enum parsed succesfully, value: {0}.", fruit);
    }
    else
    {
        Console.WriteLine("Enum couldn't be parsed.");
    }
}

Működni működik, de elég cifra kód. A Framework 4.0 Base Class Library-jében kapunk egy új, generikus metódust, a TryParse(), amivel jóval egyszerűbbé és érthetőbbé válik a kód:

public static void ParseEnum40(string fruitName)
{
    Fruit fruit;

    if (Enum.TryParse(fruitName, out fruit))
    {
        Console.WriteLine("Enum parsed succesfully, value: {0}.", fruit);
    }
    else
    {
        Console.WriteLine("Enum couldn't be parsed.");
    }
}
Külön szépség, hogy bár az Enum.TryParse() egy generikus metódus (tehát valójában az Enum.TryParse<Fruit>()-ot hívjuk), de a típusparamétert - mivel az ugyanaz, mint a második függvényparaméter, az out fruit típusa -, nem kell kiírnunk, a fordító kiinferálja nekünk.

Mindennek ellenére, hogy most már ilyen rettenetesen könnyű és szép enumokkal dolgozni, azért azt tartsuk észben, hogy az enum-sztring konverzió elég lassúcska, teljesítményérzékeny alkalmazásokban néha rá kell programoznunk, ha nem akarunk odaborostásodni a gép elé.

2 megjegyzés:

Névtelen írta...

Persze, hogy cifra, ha azzá teszed :)

public static void ParseEnum(string fruitName)
{
Fruit fruit = default(Fruit);

try
{
fruit = (Fruit)Enum.Parse(typeof(Fruit), fruitName);
Console.WriteLine("Enum parsed succesfully, value: {0}.", fruit);
}
catch (ArgumentException)
{
Console.WriteLine("Enum couldn't be parsed.");
}
}

Persze a .NET4-es kód gyorsabb, mert nem használ exceptiont.

Molnár Gergő írta...

Jóhogy cifrává teszem, ha azt akarom bemutatni, hogy cifra.. :)

Megjegyzés küldése