|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
[C#] Unboxare un oggetto da una collection prima di usarlo
Ciao,
ho hands, che è un ArrayList dove infilo degli oggetti di classe Hand. Hand ha due metodi: AddCardToHand() e ToString() che viene specificato come override al ToString che hanno tutte le classi. Ho notato che scrivendo: hands[index].ToString() funziona, mentre hands[index].AddCardToHand() no. Ho capito che è dovuto al fatto che ArrayList contiene object, che hanno di default un metodo ToString() (che viene poi scavalcato da quello di Hand a runtime) ma non un AddCardToHand(), e a compile time, nonostante gli abbia già inserito degli Hand, l'ArrayList hands non sa che ritornerà dei Hand anzichè degli object. Tutto chiaro. Allora ho provato l'unboxing "inline": (Hand)hands[index].AddCardToHand() ma non funziona come mi aspettavo, come mai? Devo per forza scrivere una linea di codice in più dove faccio posto all'oggetto Hand unboxato? |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Codice:
((Hand)hands[index]).AddCardToHand(); |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
List...non sapevo che esistesse |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jun 2012
Città: Roma
Messaggi: 115
|
in alternativa .net 4.0 permette di usare i dynamics
dynamic c=hands[index]; c.AddCardToHand(); è meno efficiente, però più elegante |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
Hand c=hands[index]; c.AddCardToHand(); |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
ArrayList nel tuo caso non e' la collezione migliore.
Raramente lo e'. Anzi, praticamente obsoleta. Prova ad usare una List<Hand>
__________________
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. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
E' permessa ma sconsigliata.
Proprio a causa del boxing/unboxing, che invece e' evitato nella List<T> Hashtable, Arraylist arrivano dal C#1.1,ed occorre una piu' che valida ragione per usarle invece delle loro controparti del C#2.0 (Dictionary<T,U> e List<T>)
__________________
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. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
![]() Vabbè almeno i concetti fondamentali non saranno cambiati, ma solo certe classi... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:26.





















