Casino online











Mercato forex






A24. Le Proprietà - Parte II



È possibile anche specificare uno o più parametri per individuare con maggiore precisione un dato all'interno della classe. Tuttavia è bene non usare mai più di un parametro, ond'evitare di rendere il codice più disordinato e prolisso. In genere si usa un parametro nel corpo di una proprietà per ricavare un elemento da una lista. Riprendendo l'esempio del capitolo precedente:
Module Esempio
    'Una classe per gestire le annotazioni
    Class MyNotes
        'ArrayList di stringhe
        Private _Notes As New ArrayList

        'Questa proprietà in sola lettura accetta un parametro,
        'ossia l'indice dell'annotazione da prelevare. Se l'indice
        'è minore della dimensione, prende la stringa voluta,
        'altrimenti restituisce Nothing
        Public ReadOnly Property Note(ByVal Index As Int32) As String
            Get
                If Index < _Notes.Count And Index >= 0 Then
                    Return _Notes(Index)
                Else
                    Return Nothing
                End If
            End Get
        End Property

        'Aggiunge una nuova annotazione, a patto che non sia
        'una stringa vuota
        Public Sub AddNote(ByVal Note As String)
            If Note <> "" Then
                _Notes.Add(Note)
            End If
        End Sub
    End Class

    Sub Main()
        Dim N As New MyNotes

        N.AddNote("Andare a prendere il pane.")
        N.AddNote("Ritirare il vestito.")
        N.AddNote("Comprare un tappeto nuovo.")

        'Scrive a schermo la seconda annotazione
        Console.WriteLine(N.Note(1))
        Console.ReadKey()
    End Sub
End Module 


Proprietà di Default

Le proprietà di default possono essere richiamate semplicemente specificando il nome della classe in cui si trovano. Per non creare ambiguità tuttavia, devono rispettare queste due regole: devono avere almeno un parametro. altrimenti non si potrebbe distinguere tra il nome della classe usato come tipo e quello usato per richiamare la proprietà di default; deve essercene una e una sola per ogni classe, in caso contrario il .Net non saprebbe quale scegliere. Un esempio comune di proprietà di Deafult è ArrayList.Item:
Dim A As New ArrayList
A.Add("Ciao")
A.Add("Come")
A.Add("Stai?")
Console.WriteLine(A(1))
Console.WriteLine(A.Item(1)) 
Le due chiamate a Console.WritLine() genereranno lo stesso messaggio a video, ossia "Come", il membro con indice 1 nell'ArrayList. La cosa interessante, però, è che scrivere A(1) equivale a scrivere A.Item(1): Item è la proprietà di default per la classe ArrayList e perciò può essere richiamata con il nome della classe stessa e specificando l'unico parametro. La sintassi standard è questa:
Default Property [Nome della proprieta']([Almeno un parametro]) As [Tipo]
    Get
        '...
        Return [Valore]
    End Get
    Set(ByVal Value As [Tipo])
        '...
    End Set
End Property 
Nonostante il compilatore riordini automaticamente le parole riservate, mi sembra di non sprecare spazio specificando l'ordine in cui vanno specificati tutti gli eventuali attributi. Fin'ora abbiamo visto che le proprietà possono essere Public, Private o Friend, poichè sono membri di classe (anche se Private si usa raramente), ReadOnly, WriteOnly o Default a seconda della funzione. L'ordine corretto è:
[Default] [ReadOnly/WriteOnly] [Public/Friend/Private] Property ... 
Preparatevi perchè questo è niente in confronto a tutte le altre keyword che vi spiegherò in seguito!


Get e Set con specificatore di accesso
È possibile che oltre a quello della proprietà stessa, anche il blocco Set o il blocco Get siano marcati con uno specificatore di accesso (detto anche "keyword di scope"). In questo caso la keyword di scope dei blocchi interni deve essere più restrittiva rispetto a quella utilizzata per la proprietà: ad esempio non si può avere una proprietà Private con un Get Public o Friend. Questo espediente serve solo a limitare l'accesso a determinate parti della proprietà verso alcuni componenti dell'applicazione. Si potrebbe avere una proprietà Public il blocco set è dichiarato Private: in questo caso, tutti gli assembly che vi si riferiscono possono leggerne il valore, ma solo i membri della sua classe possono impostarlo. È la stessa cosa che usare la keyword ReadOnly, solo che in questo modo viene concessa la flessibilità del meccanismo ai membri della classe.
Public Property ItemsNumber() As Int32
    Get
        Return _ItemsNumber
    End Get
    Private Set(ByVal Value As Int32)
        If Value >= 0 Then
            _ItemsNumber = Value
        Else
            _ItemsNumber = 0
        End If
    End Set
End Property 


Istanziamento differito
La tecnice dell'Istanziamento Differito consiste nell'inizializzare un oggetto solo se questo è effettivamente richiesto dall'applicazione. Ne parlo nel capitolo sulle proprietà in quanto è possibile mettere in atto questa tecnica sopratuto nel loro corpo. Ad esempio:
Module Esempio2
    Class MyNotes
        'ArrayList di stringhe, non inizializzato
        Private _Notes As ArrayList

        Public ReadOnly Property Note() As ArrayList
            Get
                'Solo se l'ArrayList viene effetivamente richiesto
                'è inizializzato, altrimenti non si occupa
                'memoria superflua nell'heap managed
                If _Notes Is Nothing Then
                    _Notes = New ArrayList
                End If
                Return _Notes
            End Get
        End Property
    End Class
End Module 






 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.