Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Organizzazioni in Classi - 2
Forum - C# / VB.NET - Organizzazioni in Classi - 2 - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:59
Domenica, 14/08/2011
Non mi sembra un ossimoro. I campi private shared (o private static in C#) sono molto più usati di quello che potresti pensare. :heehee:

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 23:13
Domenica, 14/08/2011
Bhe, se lo dite voi, ci credo:yup: Comunque grazie.:k:
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ì:
Codice sorgente - presumibilmente VB.NET

  1. Public Class ListaConst
  2.  
  3.    Private Structure RowList
  4.       Public Let As String
  5.       Public LRange() As Byte
  6.    End Structure
  7.  
  8.    Private RowTable As List(Of RowList)
  9.    
  10.    Public Sub New()
  11.       RowTable .Add(New RowList With {.Let = "01A", .LRange = New Byte() {1, 2, 3, 4, 7}})
  12.       RowTable .Add(New RowList With {.Let = "01B", .LRange = New Byte() {21, 22, 23, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35}})
  13.       RowTable .Add(New RowList With {.Let = "01C", .LRange = New Byte() {26, 29}})
  14.       RowTable .Add(New RowListWith With {.Let = "02A", .LRange = New Byte() {1, 2, 3, 4, 6}})


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ò???8-|
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
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:30
Lunedì, 15/08/2011
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 è).

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 18:14
Lunedì, 15/08/2011
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

  1. 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..:d:noway:
Grazie.
Aggiornamento: sono riuscito a fare la dichiarazione della lista come la volevo:
Codice sorgente - presumibilmente VB.NET

  1. Public Shared d As New List(Of Dictionary(Of String, Byte())) From {
  2.             New Dictionary(Of String, Byte()) From {{"A", {1, 2, 3, 4, 7}},
  3.                                                     {"B", {21, 22, 23, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35}},
  4.                                                     {"C", {26, 29}}},
  5.             New Dictionary(Of String, Byte()) From {{"a", {1, 2, 3, 4, 6}},


Ora vedo se riesco a creare un metodo shared per estrarre i dati che mi servono...

Ultima modifica effettuata da Renny il 15/08/2011 alle 21:11
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:21
Martedì, 16/08/2011
Le liste e i dizionari devono essere inizializzati per forza. Se non ti riesce di farlo inline, crea un oggetto singleton e fallo nel costruttore.

P.S.: evita di dare nomi banali alle entità. Non chiamare Lista una lista, Stringa un stringa o Dizionario un dizionario...

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 12:56
Martedì, 16/08/2011
OK. Intanto Grazie.:)
Visto che si parlava di oggetti singleton, ho letto qui:
http://vbnotebookfor.net/2007/09/13/introduction-to-the-si ... e ho fatto così:
Codice sorgente - presumibilmente VB.NET

  1. Public Class MySingleton
  2.         Private Shared _thisInstance As MySingleton
  3.         Private ListaLocalizzazioni As List(Of Dictionary(Of String, Byte()))
  4.  
  5.         Protected Sub New()
  6.             ListaLocalizzazioni = New List(Of Dictionary(Of String, Byte())) From {
  7.             New Dictionary(Of String, Byte()) From {{"A", {1, 2, 3, 4, 7}},
  8.                  {"B", {21, 22, 23, 24, 25, 27, 28, 30, 31, 32, 33, 34, 35}},
  9.               'altri dictionary ecc ecc
  10.         End Sub
  11.         Public Shared Function GetSingleton() As MySingleton
  12.             If _thisInstance Is Nothing Then 'se l'oggetto non c'è lo costruisco
  13.                 _thisInstance = New MySingleton
  14.             End If
  15.             Return _thisInstance
  16.         End Function
  17.         Public Function GetRange(ByVal Livello As Byte, ByVal Let As String) As Byte()
  18.             Return ListaLocalizzazioni.Item(ntav).Item(loc)
  19.         End Function
  20.     End Class


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

  1. Dim Elenco As MySingleton = MySingleton.GetSingleton
  2. 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?:-|

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:41
Mercoledì, 17/08/2011
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

  1. Public Class MySingleton
  2.    Private Shared _thisInstance As MySingleton
  3.    Private ListaLocalizzazioni As List(Of Dictionary(Of String, Byte()))
  4.  
  5.    Protected Sub New()
  6.       ' ...
  7.    End Sub
  8.        
  9.    Public Shared Property Singleton() As MySingleton
  10.       Get
  11.          If _thisInstance Is Nothing Then
  12.             _thisInstance = New MySingleton
  13.          End If
  14.          Return _thisInstance
  15.       End Get
  16.    End Property
  17.  
  18.    Public Function GetRange(ByVal Livello As Byte, ByVal Let As String) As Byte()
  19.       Return ListaLocalizzazioni.Item(Livello).Item(Let)
  20.    End Function
  21.  
  22. End Class


In questo modo puoi richiamare il metodo GetRange così:
Codice sorgente - presumibilmente C# / VB.NET

  1. 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.

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 11:33
Venerdì, 19/08/2011
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

  1. 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?8-|

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo