|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Messaggi: n/a
|
[c#] Domanda veloce sui tipi valore
ciao a tutti ragazzi! sono un nuovo studente fai da te del c# che ha incontrato alcuni problemi di comprensione di un testo della wrox guida allo sviluppatore c#.
la domanda è questa: ho letto che le struct e i tipi predefiniti int long etc sono tipi valori ma derviano tutti dalla classe object (genitore di tutti i tipi). quando si lanciano dei metodi (tipo i.maxvalue, i.tostring dove i magari è un intero) su questi tipi quello che c# fa è fare un boxing su questi valori ovvero renderli riferimenti (da object) memorizzandoli sull'heap. quello che mi domando è: quando lancio un metodo di una struct da me definita questa viene sempre boxata oppure rimane un tipo di valore e quindi rimane memorizzata nello stack? anche per gli int, qualsiasi metodo chiami sempre verrà boxato o ci sono dei metodi per cui rimane un tipo valore e quindi memorizzato nello stack? spero di essere stato chiaro! ciao a tutti |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ciao.
Penso ci sia un'incomprensione. Codice:
int t=15; string str = t.ToString(); Console.WriteLine(str); Anche il metodo di una tua struttura non generera' alcun boxing. Un boxing potrebbe avvenire se si chiama una funzione nel cui prototipo c'e' un object, e la si utilizza indifferenemente sia per tipi value che per tipi reference. Ma non e' il caso ne' della ToString degli interi, ne del metodo della tua struttura Ma e' comunque una cosa da evitare a tutti i costi. (ES: Le vecchie Hashtable e le vecchie ArrayList, strutture non tipizzate del C#1.0)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Messaggi: n/a
|
v
grazie per la risposta!
quindi si rimane sempre nel campo dei valori e quindi nello stack giusto? in realltà mi aveva confuso l'affermazione del testo in cui per boxing prendeva anche la conversione implicita i.tostring()..... ciao ciao |
![]() |
![]() |
#4 |
Messaggi: n/a
|
CONTINUO A NON CAPIRE:................
Ho trovato scritto questo:
Il Boxing avviene automaticamente quando un value type è utilizzato in una locazione che richiederebbe l'uso di un oggetto. Il Boxing di un value type consiste nell'allocare l'istanza di un oggetto e copiare il valore nell'istanza. Come più volte sottolineato, C# fornisce un type system unificato, tutti i tipi compresi i value type, derivano da oggetti. E' possibile richiamare metodi di oggetti su ogni valore, persino valori di tipi "primitivi" come int. In questo esempio il metodo ToString, definito come oggetto viene chiamato su di un integer: using System; class Test { static void Main() { Console.WriteLine(3.ToString()); } } Allora quando faccio tostring su in intero lo fa il boxing....... ![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Si' rimane nel campo dei Valori, e non viene quindi boxata.
Diverso sarebbe se tu scrivessi una funzione tipo Codice:
public void Print(object ob) { ... }
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
3.ToString() non da alcun boxing, in quanto il metodo ToString e' anche implementato dalla struttura int in modo nativo Console.WriteLine ha tanti prototipi, tra cui quello che stampa una stringa (ci mancherebbe) quindi nessun boxing neppure qui
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:49.