Newsgroup: it.comp.dotnet
Titolo: struct

Ciao,
 
 
una sctruct viene istanziata in memoria (se ho ben capito nello stack) 
quando la utilizzo o anche solamente per il fatto che l'ho definita nel 
codice del programma?
 
grazie
 


Le dichiarazioni:
Point p;
oppure
Point p = new Point();
sono equivalenti ed allocano automaticamente un Point nello stack 
(quindi niente GC).
Le struct sono valuetype e questo significa che ogni volta che passi un 
Point ad un metodo, questo riceverà una copia del tuo Point (quindi se 
dentro il metodo fai modifiche al Point rimarranno locali a quel 
metodo).
 
La definizione:
struct Point{....}
non alloca nulla ma genera codice e metadati (che occupano ovviamente 
memoria ma non alloca alcun oggetto di tipo Point).
 
-- 
Raffaele Rialdi  
http://www.iamraf.net
 
Weblog: 
http://blogs.ugidotnet.org/raffaele
 
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
 
UGIdotNET - 
http://www.ugidotnet.org/
 
 
 

 dentro il metodo fai modifiche al Point rimarranno locali a quel metodo).
 
 
grazie

 struct Point{....}
 
Quella e' una dichiarazione.
 
-LV
 
 


 
Mi hai fatto venire la curiosità e sono andato a vedere nelle specs C#.
A quanto leggo non esiste una nomenclatura standard visto che si legge  
"Local variable declaration", "struct declaration" e ancora chiama le 
definizioni dei metodi sia "declarations" che "definitions"


 definizioni dei metodi sia "declarations" che "definitions"
 
Ti confermo che quella e' la nomenclatura giusta: dichiarazione di tipi, 
definizione di istanze. Il motivo dell'ambiguita' nella documentazione 
(tralasciando ovviamente il fatto che in rete si trova di tutto di piu' e 
c'e' anche molto di scorretto) e' che quando per esempio in un metodo scrivi 
"int a = 1;" stai facendo dichiarazione e definizione insieme. (Per chi ha 
esperienza di Pascal, questa distinzione e' analoga a quella che in Pascal 
passa fra interface e implementation.)
 
-LV
 


 
Io parlo proprio del reference del linguaggio, non della 
documentazione.
 
 
Ad ogni modo due note 'bibbie' la vedono in modo opposto:
 
Kernighan/Ritchie dicono:
"You should note that we are using the words definition and declaration 
carefully when we refer to external variables in this section. 
'Definition' referst to the place where the variable is created or 
assigned storage; 'declaration' refers to places where the nature of 
the variable is stated but no storage is allocated"
 
Stroustrup dice:
"The construct class X {...}; is called a class definition because it 
defines a new type."
 
Evidentemente è cambiata la nomenclatura dai linguaggi procedurali a 
quelli OOP (mia mera deduzione).



No, IMHO nessuna ambiguità:
 
stroustrup dice *class* definition e quel costrutto (con le graffe) sta 
definendo una classe, cioà un nuovo tipo.
Se invece scrivi class X; (senza le graffe) quella è una dichiarazione 
di classe.
E qui stiamo parlando di dichiarazione/definizione di un TIPO
 
Non ti confondere con la definizione/dichiarazione di una variabile, 
dove il discrimine è quello citato da K&R.
 
 
 
 
 

 Ad ogni modo due note 'bibbie' la vedono in modo opposto:
 
La nomenclatura corretta resta quella che indicavo: come detto, c'e' una 
certa ambiguita' nell'uso.  Poi Stroustrup e' notoriamente uno un po'... 
particolare, ma e' vero anche che tu non hai dato il contesto di quella 
citazione.
 
Comunque penso sia inutile stare a cavillare: se non mi trovi credibile, 
cosi' sia!  ;)
 
-LV
 

 discrimine è quello citato da K&R.
 
la nomenclatura del K/R a riguardarla è coerente ma opposta a quanto 
leggo invece sullo Stroustrup.
 
 
Cmq non me ne faccio un problema nè voglio sollevarne una questione.
Ho solo risposto a LV che ha rimarcato la differenza di termini.
L'importante è capirsi :)



 
:)
Non voglio cavillare e quando ho scritto quel che ho scritto non ci ho 
pensato sopra due volte, è solo una questione di abitudine (certamente 
alimentata dalle mie letture).
