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.
- 1. Perché i tipi di riferimento sono archiviati nell'heap
- 2. I tipi Null sono tipi di riferimento?
- 3. Quando sono necessarie le interfacce?
- 4. Perché le interfacce non sono consentite come membri delle annotazioni?
- 5. Perché i tipi di riferimento non sono inizializzati su null?
- 6. Le enumerazioni Java sono considerate tipi primitivi o di riferimento?
- 7. Perché le costanti non sono tutte in maiuscolo in .Net?
- 8. Perché implementiamo le interfacce in modo ricorsivo?
- 9. Valore vs tipi di riferimento quando si usano le interfacce in C#
- 10. Perché i tipi di riferimento di boxe?
- 11. Le interfacce non possono dichiarare i tipi
- 12. Perché le proprietà non sono dichiarabili nelle interfacce
- 13. Trattare con enumerazioni quando le interfacce sono in progetto separato
- 14. Perché stiamo implementando le interfacce?
- 15. Interfacce senza conteggio di riferimento
- 16. Riferimento automatico nelle interfacce
- 17. Tipi generici vs Classe astratta/Interfacce
- 18. Dattiloscritto: interfacce vs tipi
- 19. Le interfacce a schede sono confuse?
- 20. Perché gli eventi non hanno tipi di ritorno in .NET?
- 21. Uguaglianza nei tipi di riferimento
- 22. interfacce Java ei tipi restituiti
- 23. Forza protobuf-net per ignorare le interfacce IEnumerable/ICollection
- 24. quali sono le interfacce più utilizzate in C#?
- 25. Struct contenente tipi di riferimento
- 26. circolare riferimento fra due complessi NET
- 27. Tipi di valore e riferimento
- 28. interfacce "admin" separate per diversi tipi di utenti in django
- 29. Perché i risultati dei metodi Equals e ReferenceEquals differiscono anche se le variabili sono tipi di riferimento?
- 30. Tipi di asserzioni .NET
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 ... –