È necessaria l'interpretazione della sezione nella specifica C #


11

Sto leggendo la specifica C # . Potrei usare chiarimenti su un segmento:

C # ha un sistema di tipo unificato. Tutti i tipi di C #, compresi i tipi primitivi come int e double, ereditano da un singolo tipo di oggetto root. Pertanto, tutti i tipi condividono un insieme di operazioni comuni e valori di qualsiasi tipo possono essere memorizzati, trasportati e gestiti in modo coerente. Inoltre, C # supporta sia tipi di riferimento definiti dall'utente sia tipi di valore, consentendo l'allocazione dinamica di oggetti e la memorizzazione in linea di strutture leggere.

Cosa significa "stoccaggio in linea di strutture leggere" in questo contesto?

Risposte:


11

La risposta di Svick è buona, ma ho pensato di aggiungere qualche punto in più.

Prima di tutto, il paragrafo è imperfetto. I tipi di puntatore non ereditano dall'oggetto. I valori che sono noti al momento della compilazione come tipi di interfaccia o tipi di parametro di tipo saranno, in fase di esecuzione, riferimenti non validi o istanze in buona fede di qualcosa che eredita dall'oggetto, ma mi ha sempre strutturato come strano dire che questi tipi " ereditare "dall'oggetto; l'ereditarietà è la proprietà che i membri dell'antenato sono membri del discendente, ma normalmente non si considera "ToString" come un membro di IEnumerable. Lo pensi come un membro della cosa che implementa IEnumerable .

Anche il paragrafo è imperfetto perché questo è l'unico posto in cui "tipo primitivo" appare nelle specifiche e appare senza definizione. È quindi inutile e confuso e dovrebbe essere rimosso.

Ho voluto che questo paragrafo venisse corretto per un po '. La prossima volta che vedrò Mads glielo ricorderò.

Per rispondere alla tua domanda specifica: svick è ovviamente corretto ma è utile vedere un esempio specifico. Quando dici:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

e crei, diciamo, un array:

ColorfulInt[] x = new ColorFulInt[100];

Quindi l'archiviazione per quei 100 pollici e 100 colori va nell'array stesso . Se ColorfulInt fosse invece una classe, l'array conterrebbe 100 riferimenti a ColorfulInt, ognuno dei quali dovrebbe essere allocato individualmente. L'allocazione individuale di questi cento elementi è molto meno efficiente sia nel tempo che nello spazio rispetto alla semplice allocazione dell'archiviazione nell'array stesso.


Quindi, è importante l'astrazione della memoria di quegli oggetti, dove quando sei pronto a manipolarli è più facile accedervi se si trovano in un blocco contiguo di spazio indirizzabile verso puntatori a chissà dove? È corretto o mi manca ancora qualcosa?
ChuckT

@ChuckT: corretto. Non si paga l'overhead dell'indirizzamento indiretto e si ottiene anche una buona posizione della cache.
Eric Lippert,

12

Significa che i tipi di valore vengono archiviati direttamente dove vengono definiti, il che li rende più efficienti rispetto ai tipi di riferimento.

Cosa significa esattamente? Se si dispone di una variabile locale di un tipo di valore, questa verrà generalmente memorizzata direttamente nello stack (ma ci sono molte eccezioni). Se si dispone di un campo di un tipo di valore, verrà memorizzato direttamente nella classe o struttura che lo racchiude.


1
Ha senso. Grazie per avermelo detto, svick!
ChuckT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.