Dlaczego deklaracja pola ze zduplikowanym typem zagnieżdżonym w klasie ogólnej powoduje ogromny wzrost kodu źródłowego?
Scenariusz jest bardzo rzadki, ale dość prosty: definiujesz klasę ogólną, a następnie tworzymy klasę zagnieżdżoną, która dziedziczy z klasy zewnętrznej i definiuje pole asocjacyjne (typu własnego) wewnątrz zagnieżdżonego. Fragment kodu jest prostszy niż opis:
class Outer<T>
{
class Inner : Outer<Inner>
{
Inner field;
}
}
po dekompilacji IL kod C # wygląda tak:
internal class Outer<T>
{
private class Inner : Outer<Outer<T>.Inner>
{
private Outer<Outer<T>.Inner>.Inner field;
}
}
Wydaje się to dość sprawiedliwe, ale kiedy zmienisz deklarację typu pola, sprawy staną się trudniejsze. Więc kiedy zmieniam deklarację pola na
Inner.Inner field;
Po dekompilacji to pole będzie wyglądać następująco:
private Outer<Outer<Outer<T>.Inner>.Inner>.Inner field;
Rozumiem, że „zagnieżdżanie” klas i dziedziczenie nie pasują do siebie, aledlaczego obserwujemy takie zachowanie? Jest Inner.Inner
deklaracja typu w ogóle zmieniła typ? Są Inner.Inner
i Inner
w tym kontekście różnią się w jakiś sposób?
Możesz zobaczyćdekompilowany kod źródłowy dla klasy poniżej. Jest naprawdę ogromny i ma całkowitą długość 12159 symboli.
class X<A, B, C>
{
class Y : X<Y, Y, Y>
{
Y.Y.Y.Y.Y.Y y;
}
}
Wreszcie ta klasa:
class X<A, B, C, D, E>
{
class Y : X<Y, Y, Y, Y, Y>
{
Y.Y.Y.Y.Y.Y.Y.Y.Y y;
}
}
prowadzi do27.9 MB (29,302,272 bytes)
montaż iTotal build time: 00:43.619
Kompilacja odbywa się w kompilatorach C # 5 i C # 4. Dekompilacja jest wykonywana przez dotPeek. Buduj konfiguracje:Release
iDebug