Statikusok
Szerző 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? :-)
boci mondta
Igen Mucika, mindig túl sokat :D
Amúgy jelen esetben nem. Szerintem is ezt jeleznie kéne a fordítónak.