Cooldavee blogja

Érdekes és idegesítő történetek. Vagy nem.

Statikusok

Posted by cooldavee - 2008. december 9. kedd

Ma a Hogyan szivassuk meg magunkat C#-ban egyik iskolapéldáját fogjuk venni:

class Foo
{
    public readonly object o;

    public Foo(object o)
    {
        this.o = o;
    }

    public static readonly Foo fooDefault = new Foo(oDefault);
    public static readonly object oDefault = new object();
}


Evvel ugyanis az a baj, hogy oDefault csak fooDefault után fog inicializálódni (amilyen sorrendben deklarálva vannak), így fooDefault.o értéke null lesz. Ha helyest kódot akarunk, akkor figyelni kell a két adattag sorrendjére:

class Foo
{
    public readonly object o;

    public Foo(object o)
    {
        this.o = o;
    }

    public static readonly object oDefault = new object();       // first
    public static readonly Foo fooDefault = new Foo(oDefault);   // second
}

Lehet, hogy naiv vagyok, de én tényleg hittem benne, hogy ez sorrendtől függetlenül is működni fog. A fordító igazán észrevehetné, hogy fooDefault értéke oDefault-tól függ. Persze ezt ő észre is veszi, csak éppen leszarja, és csak azért sem inicializálja előbb oDefault-ot. De még ha nem is csinálja azt, amit szeretnék, legalább szólhatna, hogy hülye vagyok. Mint ahogy pl. lokális változók esetén szól is:

class Bar
{
    public void Baz()
    {
        Foo foo = new Foo(o);      // Error: Cannot use local variable 'o' before it is declared
        object o = new object();

        object o2;
        Foo foo2 = new Foo(o2);    // Error: Use of unassigned local variable 'o2'
        o2 = new object();
    }
}

Túl sokat akarok? :-)

Reklámok

Egy hozzászólás to “Statikusok”

  1. boci said

    Igen Mucika, mindig túl sokat :D

    Amúgy jelen esetben nem. Szerintem is ezt jeleznie kéne a fordítónak.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés /  Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés /  Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés /  Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés /  Módosítás )

Kapcsolódás: %s

 
%d blogger ezt kedveli: