2009-04-17 9 views
13

Il compilatore C# sembra notare tutte le interfacce e le sue classi base implementano. Le specifiche CLI dicono che questo non è necessario. Ho visto alcuni altri compilatori non emetterlo esplicitamente, e sembra funzionare bene. C'è qualche differenza o ragione nel C#?Perché il compilatore C# dichiara esplicitamente tutte le interfacce di un tipo implementate?

Il MSIL che il C# in fondo genera per la B è:

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

Non dovrebbe essere necessario specificare ISimple, perché A implementa come fa IAdvanced. Codice C#:

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"; } 
    } 
} 

risposta

7

Non credo possiamo sapere qualsiasi risposta definitiva qui, a meno che non abbiamo il compilatore sviluppatori cadere in Tuttavia, siamo in grado di indovinare le ragioni.. Potrebbe essere:

  1. per l'ottimizzazione - forse risparmia un po 'di lavoro per il compilatore JIT.
  2. per la leggibilità: per gli occhi umani è più facile capire che cosa implementa un tipo quando si guarda l'output di MSIL.
  3. perché è così che lo stagista estivo lo ha implementato e poiché funziona bene, nessuno lo cambierà nel caso in cui si rompa qualcosa.
+0

IIRC, tutto è chiaramente definito nelle specifiche. Quindi non indovinare qui. – leppie

+0

Andrei per la porta numero tre! ;-) – peSHIr

+0

Sì, la partizione II delle specifiche CLI chiarisce che non è richiesta. Non ho visto se dicesse che aggiungerlo in realtà fa qualcosa comunque. – MichaelGG

Problemi correlati