Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Bhe, se lo dite voi, ci credo Comunque grazie. Comunque, ora mi trovo a dover risolvere un'altro piccolo problema. Dovrai dichiarare una serie di valori costanti organizzati così:
1 Livello -> A -> array di byte {1,2,3,4,5,8,10}
-> B -> array di byte {10,12,13,14,17...}
-> c -> array di byte {3,9}
2 Livello -> A -> array di byte {1,2,3,4,5,6,9}
.....
10 livello -> A ecc
Praticamente 10 livelli, ogni livello a sua volta ha 3,4 sottolivelli identificati da una lettera a cui corrisponde un array di valori byte.
Per ora ho risolto così:
Ho codificato insieme il 1°Livello (da 1 a 10) con il sottolivello (lettere A,B,C) e li ho abbinati all'array di byte in una struttura. Dopo di che ho dichiarato una lista di "strutture". Nel mio programma, ho una funzione che riceve livello e sottolivello (ad esempio "01A") e mi restituire l'array di byte, che serve a me. La mia domanda è:
c'è un modo migliore per fare tutto ciò??? Probabilmente una miglioria potrebbe essere di dichiarare la classe come statica. Perché in effetti nel mio codice devo istanziare un oggetto ListaConst diverse volte, creando ogni volta la tabella di costanti...
Ultima modifica effettuata da Renny il 15/08/2011 alle 0:10
Beh, questo sta un po' a te deciderlo. Puoi fare una classe statica o un oggetto singleton. Puoi usare liste di strutture oppure dizionari oppure ancora liste di dizionari (o dizionari di liste). Quello che non dovresti fare è lasciare che la classe sia istanziabile più di una volta (come adesso è).
Uhm.. Non sono sicuro di aver capito.
Comunque, riguardando i possibile "strumenti" che vb.net mette a disposizione, forse il modo più "ordinato" per caricare i dati è questo:
Codice sorgente - presumibilmente C# / VB.NET
Public Lista As List(Of Dictionary(Of String, Byte()))
Gli elementi della lista vanno da 1 a 10 e posso usare Item per accedere a quello specifico (1° livello della gerarchia). La Tkey del dictionary è string (lettere A, B, C) che identifica il sottolivello e il Tvalue è il mio array di Byte.
Il mio dubbio è: devo per forza usare un costruttore New per caricare tutti i dati nella List? A me serve un oggetto di tipo Lista, a livello globale in modo che da ogni punto del codice posso recuperare l'array di byte, passando a una funzione il livello (item della list) e lettera (Tkey del dictionary). Come posso fare? Dove devo istanziare l'oggetto? Ho fatto un po di prove ma nn ci sono riuscoto.. Grazie.
Aggiornamento: sono riuscito a fare la dichiarazione della lista come la volevo:
Codice sorgente - presumibilmente VB.NET
PublicShared d AsNew List(Of Dictionary(Of String, Byte())) From {
NewDictionary(Of String, Byte()) From {{"A", {1, 2, 3, 4, 7}},
If _thisInstance IsNothingThen'se l'oggetto non c'è lo costruisco
_thisInstance =New MySingleton
EndIf
Return _thisInstance
EndFunction
PublicFunction GetRange(ByVal Livello AsByte, ByValLetAsString)AsByte()
Return ListaLocalizzazioni.Item(ntav).Item(loc)
EndFunction
EndClass
Da quello che ho capito, rendendo il costrutture New Protect non accessibile, la classe si premura di essere istanziata solo se non esiste già, tramite la variabile statica _thisInstance. Bel trucchetto.
Ora, a livello di codice, per rendere la mia istanza sempre accessibile (a me serve la funzione che ritorna l'array di byte (GetRange), dove devo dichiararla? In teoria, per ogni volta che mi serve potrei scrivere
Codice sorgente - presumibilmente C# / VB.NET
Dim Elenco As MySingleton = MySingleton.GetSingleton
dim ByteRange() = Elenco.GetRange(1,"A")
Tanto l'oggetto con i dati è già caricato, semplicemente istanzio un nuovo oggetto elenco che punta (per riferimento) all'oggetto singleton.. giusto?
Non è il costruttore protected che rende l'oggetto singleton. I costruttori privati o protetti sono un modo comune per implementare un metodo factory obbligatorio, che normalmente sarebbe GetSingleton. In questo caso, però, non si tratta di un metodo factory perché restituisce sempre la stessa istanza. Allora non dovrebbe nemmeno essere un metodo, ma piuttosto una proprietà:
Codice sorgente - presumibilmente VB.NET
PublicClass MySingleton
PrivateShared _thisInstance As MySingleton
Private ListaLocalizzazioni As List(Of Dictionary(Of String, Byte()))
Protected SubNew()
' ...
EndSub
PublicSharedProperty Singleton()As MySingleton
Get
If _thisInstance IsNothingThen
_thisInstance =New MySingleton
EndIf
Return _thisInstance
EndGet
EndProperty
PublicFunction GetRange(ByVal Livello AsByte, ByValLetAsString)AsByte()
In questo modo puoi richiamare il metodo GetRange così:
Codice sorgente - presumibilmente C# / VB.NET
Dim ByteRange() As Byte = MySingleton.Singleton.GetRange(1, "A")
Questa tecnica, quella di inizializzare l'oggetto restituito da una proprietà nel blocco get, si chiama inizializzazione differita o istanziamento differito.
P.S.: stai ancora dando nomi inutili... Il nome di una variabile, proprietà o campo non deve indicare cosa è, ma cosa fa. Esattamente come chiamare stringa una stringa, chiamare MySingleton un singleton è una pratica che non dà nessun significato al codice. Se capissi a cosa servono quegli array ti suggerirei un nome più valido...
Analogamente il commento vicino all'if è inutile, poiché non dice nulla di più da quanto scritto nel codice.
Ciao, grazie per la risposta.. così il codice funziona a meraviglia. Per i nomi non ti preoccupare: nel mio progetto ho messo i nomi giusti, tipo ListaContenuti ecc ecc.. Semplicemente avevo postato il codice come l'avevo trovato sul sito.
Ora sto provando un'altra cosa: mi servirebbe creare un'overloads al metodo contains, per le list of string. Mi spiego: mi piacerebbe che il metodo funzionasse usando confronti con l'operatore like. Ad esempio, se ho un list of string tipo
Codice sorgente - presumibilmente C# / VB.NET
Dim c as New List (of String) From {"Aa","Az","Ba","Ba"}
Ora, con un ciclo prendo il primo item "Aa", individuo la sua tipologia, cioè è "Ax" e voglio verificare che tutti gli item della lista siano del tipo Ax, cioè con A come primo carattere. Se nella lista c'è un item cheNON è di tipo Ax, mi da errore. L'operatore like sarebbe (mi sembra di ricordare) not like 'A*'. Ho provato con una extention, creandomi un containsLike e bene o male funge, ma mi piacerebbe imparare a usare IEquatable Generic Interface. Ho cercato un po' in internet, ci sono esempi in cui definiscono un nuovo metodo equals
ma loro fanno confronti tra oggetti diversi. Io ho list of string, e non ci sono riuscito.. non so Grazie.se ho capito giusto. si può fare?