È necessaria l'interpretazione della sezione nella specifica C #

11

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

C# has a unified type system. All C# types, including primitive types such as int and double, inherit from a single root object type. Thus, all types share a set of common operations, and values of any type can be stored, transported, and operated upon in a consistent manner. Furthermore, C# supports both user-defined reference types and value types, allowing dynamic allocation of objects as well as in-line storage of lightweight structures.

Che cosa significa "archiviazione in linea di strutture leggere" in questo contesto?

    
posta ChuckT 18.01.2013 - 20:29
fonte

2 risposte

11

La risposta di Svick è buona, ma ho pensato di aggiungere alcuni punti extra.

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

Anche il paragrafo è imperfetto perché questo è l'unico posto che "tipo primitivo" appare nella specifica e appare senza definizione. È quindi sia inutile che confuso e dovrebbe essere rimosso.

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

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

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

e crei, per esempio, un array:

ColorfulInt[] x = new ColorFulInt[100];

Quindi la memoria per quei 100 pollici e 100 colori va nella matrice stessa . Se ColorfulInt fosse invece una classe, la matrice conterrebbe 100 riferimenti a ColorfulInt, ognuno dei quali dovrebbe essere assegnato individualmente. L'allocazione individuale di quei cento elementi è molto meno efficiente in termini di tempo e spazio rispetto alla semplice allocazione dello storage direttamente nella matrice stessa.

    
risposta data 19.01.2013 - 21:01
fonte
12

Significa che i tipi di valore sono memorizzati direttamente dove li definisci, il che li rende più efficienti se confrontati con i tipi di riferimento.

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

    
risposta data 18.01.2013 - 21:11
fonte

Leggi altre domande sui tag