Programátorská hádanka: Statický field na generické třídě

Co myslíte, že je v Member v jednotlivých případech?

class BaseClass<T>
{
	public static string Member;
}

class DerivedClass1 : BaseClass<int>
{
}

class DerivedClass2 : BaseClass<double>
{
}

class DerivedClass3 : BaseClass<int>
{
}

void Main()
{
	DerivedClass1.Member = "test";
	Console.WriteLine(DerivedClass1.Member);
	Console.WriteLine(DerivedClass2.Member);
	Console.WriteLine(DerivedClass3.Member);
}

7 thoughts on “Programátorská hádanka: Statický field na generické třídě

  1. Martin Kučera

    Co se týče příkladu tak tam bude „test“ ale co se týče generického typu, tak by v DerivedClass1 a odvozených typech se stejným generickým typem byl „test“ a v ostatnich null.

  2. Rob

    No spustit to v dotnetfiddle umím taky :)
    Otázka je spíš proč tomu tak je – podle mne kompilátor rozdělí „nestejné“ třídy a každá má svoje statické proměnné, stejné (nebo klasicky zděděné) třídy naopak statické proměnné logicky sdílí. Původní negenerický příklad vypsal 3x test – protože všechny třídy sdílely jednu statickou proměnnou.

    Spíchnul jsem demonstrativní příklad – všimněte si, že třídy 3 a 4 mají společné hodnoty.
    Ten „generalizovaný“ member prostě nejde „špatně“ přiřadit – takže logicky musí mít každá různá třída jinou statickou proměnnou.
    https://dotnetfiddle.net/gvgPvG

  3. vlkodotnet

    Generika a static je celkom zaujimavy topic, pre každý sa vytvorí osobitná statická inštancia v debug pri spusteni, v release pri prvom použití.
    Čo je ale ešte zaujimavejšie, tak, že existuje typ BaseClass`1, teda niečo ako predok (to pre prípad ak potrebujete niekedy zistiť, či maju spoločného predka). No a napriek tomu, že takýto typ existuje, nie je možné ho nastaviť reflexiou, viď https://dotnetfiddle.net/9xgwAg.
    Mimochodom aj keď to nevyzera dobre, tak veľa projektov to rieši BaseClass bez generík https://dotnetfiddle.net/yEgOf8 a do generic static fieldov davaju iba T type staticke fieldy.

Napsat komentář

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

WordPress.com Logo

Komentujete pomocí vašeho WordPress.com účtu. Log Out / Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Log Out / Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Log Out / Změnit )

Google+ photo

Komentujete pomocí vašeho Google+ účtu. Log Out / Změnit )

Připojování k %s