2011-01-09 26 views
11

Perché le interfacce fanno riferimento ai tipi? Per quanto ne so, un'interfaccia è un contratto tra classi (o struct), quindi perché è un tipo? Avrei pensato che non fosse né un tipo di valore né un tipo di riferimento.Perché le interfacce sono in tipi di riferimento .Net?

+0

Perché dici che un'interfaccia è un tipo di riferimento? –

+0

Beh, stavo facendo un esame di pratica per 70-536, e ho detto che le interfacce sono una delle cose che sono un tipo di riferimento (insieme a classi e delegati). – richard

+3

@nader it ** è ** un tipo di riferimento ... –

risposta

10

Per essere trattato come una struttura, il compilatore deve conoscere in fase di compilazione quale è il tipo di calcestruzzo, per riservare lo spazio giusto in pila. Ciò significa che, anche se una struct implementa IFoo, poi con:

var ms = new MyStruct(); 
IFoo foo = ms; 

poi l'incarico di foo è un'operazione boxe. Potresti dire che "il compilatore dovrebbe riconoscere che è sempre e solo un foo e usa il codice operativo 'constained', ma nel caso generale (con assegnazioni multiple a foo ecc.) Ciò non è possibile (rischierei di indovinare che colpirà il "problema dell'arresto").

C'è anche un problema di chiamata virtuale vs statica, ma l'opcode "vincolato" funziona intorno a quello.

In sostanza, qualsiasi utilizzo dell'interfaccia deve sempre essere considerato come riferimento.

Esiste un'eccezione: i vincoli generici.

Se hai

static void DoBar<T>(T target) where T : IFoo { 
    target.Bar(); 
} 

qui il metodo è JITted una volta per ogni valore-tipo, quindi lo stack-spazio necessario per Tè noto; la chiamata a Bar è "vincolata" e può essere virtuale o statica automaticamente in base alle esigenze.

+0

Ok, ho capito. Quindi MyStruct implementa foo, ed è ancora un tipo di valore. Ma una volta che hai lanciato MyStruct per farlo, è in scatola. il comportamento di foo lo rende un tipo di riferimento. Inoltre, a foo potrebbe essere assegnato un tipo di valore e quindi un tipo di riferimento, non lo sa mai, quindi deve comportarsi come un tipo di riferimento per coprire tutti gli scenari ... È tutto corretto? – richard

+1

@Richard tutto corretto, sì. –

3

Sono tipi di riferimento perché i tipi di valore hanno una dimensione fissa in fase di compilazione, in modo che possano essere allocati nello stack. I tipi di riferimento sono puntatori, quindi i puntatori sono di dimensioni costanti ma possono puntare alla memoria di qualsiasi dimensione.

Problemi correlati