View Full Version : [c#] Domanda veloce sui tipi valore
vittorio130881
19-11-2008, 09:40
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
Ciao.
Penso ci sia un'incomprensione.
int t=15;
string str = t.ToString();
Console.WriteLine(str);
Non genera alcun boxing.
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)
vittorio130881
19-11-2008, 15:31
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
vittorio130881
19-11-2008, 16:13
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....... :(
Si' rimane nel campo dei Valori, e non viene quindi boxata.
Diverso sarebbe se tu scrivessi una funzione tipo
public void Print(object ob)
{
...
}
Qui un ValueType verrebbe boxato
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....... :(
Questo programma non genera alcun boxing.
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.