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?
risposta
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.
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
@Richard tutto corretto, sì. –
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.
Perché dici che un'interfaccia è un tipo di riferimento? –
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
@nader it ** è ** un tipo di riferimento ... –