2009-04-17 12 views
13

Kompilator C# wydaje się wyraźnie zauważyć wszystkie jego interfejsy i klasy podstawowe. Specyfikacje CLI mówią, że nie jest to konieczne. Widziałem niektóre inne kompilatory nie wyemitować tego wyraźnie i wydaje się, że działa dobrze. Czy jest jakaś różnica lub powód, że C# to robi?Dlaczego kompilator C# jawnie deklaruje wszystkie interfejsy implementowane przez typ?

MSIL, że C# na dole generuje dla B jest:

.class private auto ansi beforefieldinit B 
     extends A 
     implements IAdvanced, 
        ISimple 

Nie powinno należy określić iSimple, bo realizuje go jak robi IAdvanced. C# Kod:

interface ISimple { 
    int Basic { get; } 
    int Zero { get; } 
} 
interface IAdvanced : ISimple { 
    string Major { get; } 
} 
class A : ISimple { 
    int ISimple.Basic { 
     get { return 1; } 
    } 
    int ISimple.Zero { 
     get{ return 0;} 
    } 
} 
class B : A, IAdvanced { 
    string IAdvanced.Major { 
     get { return "B"; } 
    } 
} 

Odpowiedz

7

Nie sądzę, możemy znać żadnego ostateczną odpowiedź tutaj, chyba że mamy kompilator deweloperzy wpaść jednak możemy się domyślać, o przyczynach.. Może to być:

  1. dla optymalizacji - może to zaoszczędzić trochę pracy dla kompilatora JIT.
  2. dla czytelności - ułatwia ludzkiemu oczom zrozumienie tego, jaki typ implementuje patrząc na wyjście MSIL.
  3. ponieważ tak zaimplementował go letni stażysta, a ponieważ działa dobrze, nikt go nie zmieni, na wypadek gdyby coś zepsuło.
+0

IIRC, wszystko jest jasno określone w specyfikacji. Więc nie zgaduj tutaj. – leppie

+0

Poszedłbym do drzwi numer trzy! ;-) – peSHIr

+0

Tak, Partition II specyfikacji CLI sprawiają, że jest całkiem jasne, że nie jest wymagane. Nie widziałem, czy powiedział, że dodanie go faktycznie robi cokolwiek. – MichaelGG