2009-12-29 10 views
5

Secondo http://msdn.microsoft.com/en-us/library/ms229017.aspx, i tipi di valore "sono allocati nello stack o in linea con altre strutture *". Eppure in the stack is an implementation detail, Eric Lippert afferma che quello è un dettaglio di implementazione.Lo stack è un dettaglio di implementazione o no?

A mio parere, un dettaglio di implementazione è "a behavior produced by code which may be relied on by consuming code, though that behavior is not specified by the spec the code is written to.". Capisco che la documentazione non è una specifica, anche se presumibilmente se qualcosa è elencato nella documentazione su cui possiamo fare affidamento e non è più un dettaglio di impianto. Quindi, lo stack è un dettaglio di implementazione o no?

*: Capisco che questo significhi che le strutture possono anche essere allocate all'interno di altre invece che direttamente sull'heap, anche se potrei sbagliarmi.

+0

relativo alla domanda: http://stackoverflow.com/questions/1970894/struct-what-is-it-for/1970902#1970902 –

+0

L'ho appena segnalato come duplicato qualche tempo fa :) – RCIX

risposta

11

La documentazione MSDN illustra la particolare implementazione che il compilatore Microsoft C# utilizza per struct. Questi dettagli particolari non sono nella specifica ECMA 334 C#; non fanno parte della semantica di struct s. Pertanto, tali dettagli nella documentazione sono dettagli di implementazione.

Mi sembra di ricordare di aver letto da qualche parte Eric Lippert che dice che desidera (o preferisce, non ricordo quale livello di preferenza ha fornito) la documentazione non ha fatto menzione dello stack in relazione a struct s. Vedrò se riesco a scavare.

Qui è, dal post sul blog che si è collegato a:

mi rammarico che la documentazione non si concentra su ciò che è più rilevante; concentrandosi su un dettaglio di implementazione in gran parte irrilevante, si amplia l'importanza di tale dettaglio di implementazione e si oscura l'importanza di ciò che rende semanticamente utile un tipo di valore. Desidero vivamente che tutti quegli articoli che spiegano cosa sia "lo stack" passerebbero invece del tempo a spiegare cosa si intenda esattamente "copiato in base al valore" e in che modo l'incomprensione o l'abuso di "copia per valore" possono causare errori.

La sezione pertinente della specifica ECMA 334 C# è §11. Nota che la parola "stack" non è mai usata in questa sezione. La sezione descrive semplicemente la sintassi, quella semantica dei valori segui struct, che sono implicitamente sigillati ed ereditati da , che l'assegnazione a una variabile di tipo struct crea una copia, che il passaggio di un valore struct come valore crea una copia, come struct s sono impostati su valori di default (tutti i campi di tipo valore del struct sono impostati ai valori di default, e tutti i campi di tipo di riferimento sono impostati per null), le regole di boxe e unboxing del struct, il significato di this per struct s circostanti e come inizializzazione del campo, costruttori, distruttori e costruttori statici funzionano per struct s. Di nuovo, nessuna menzione di pile. Mai.

Lo stack è un dettaglio di implementazione, non parte della semantica di struct.

1

Per i tipi di valore C# lo "stack" è un dettaglio di implementazione poiché ogni operazione sicura eseguita sul tipo di valore si comporterà allo stesso modo, ortogonale al fatto che la struttura sia allocata su stack o su heap.

Operazioni per le quali farebbe la differenza (ovvero finire nel fare riferimento a un frame stack deallocato), come prendere l'indirizzo e utilizzarlo direttamente (ad esempio tramite le legacy API), sono un uso non sicuro ed errato (es. utilizzando un'API Marshaling).