Guida al Visual Basic .NET
Capitolo 21° - Le Proprieta Parte II
Proprietà ReadOnly e WriteOnlyFin'ora abbiamo visto che le proprietà sono in grado di mediare l'interazione tra codice esterno alla classe e suoi campi, e tale mediazione comprendeva la possibilità di rifiutare certi valori e consentirne altri. Ma non è finita qui: usando delle apposite keywords è possibile rendere una proprietà a sola lettura (ossia è possibile leggerne il valore ma non modificarlo) o a sola scrittura (ossia è possibile modificarne il valore ma non ottenerlo). Per quanto riguarda la prima, viene abbastanza naturale pensare che ci possano essere valori solo esposti verso cui è proibita la manipolazione diretta, magari perché particolarmente importanti o, più spesso, perchè logicamente immutabili (vedi oltre per un esempio); spostando l'attenzione per un attimo sulla seconda, però, sarà parimenti del tutto lecito domandarsi quale sia la loro utilità. Le variabili, i campi, e quindi, per estensione, anche le proprietà, sono per loro natura atti a contenere dati, che verranno poi utilizzati in altre parti del programma: tali dati vengono continuamente letti e/o modificati e, per quanto sia possibile credere che ve ne siano di immodificabili, come costanti e valori a sola lettura, appare invece assurda l'esistenza di campi solo modificabili. Per modificare qualcosa, infatti, se ne deve conoscere almeno qualche informazione. La realtà è che le proprietà WriteOnly sono innaturali per la stragrande maggiorandza dei programmatori; piuttosto di usarle è meglio definire procedure. Mi occuperò quindi di trattare solo la keyword ReadOnly.In breve, la sintassi di una proprietà a sola lettura è questa: ReadOnly Property [Nome]() As [Tipo] Get '... Return [Valore] End Get End PropertyNotate che il blocco Set è assente: ovviamente, si tratta di codice inutile dato che la proprietà non può essere modificata. Per continuare il discorso iniziato prima, ci sono principalmente tre motivi per dichiarare un'entità del genere:
Module Esempio3 Class LogFile Private _FileName As String Private _CreationTime As Date 'Niente deve modificare il nome del file, altrimenti 'potrebbero verificarsi errori nella lettura o scrittura 'dello stesso, oppure si potrebbe chiudere un file 'che non esiste ancora Public ReadOnly Property FileName() As String Get Return _FileName End Get End Property 'Allo stesso modo non si pu? modificare la data di 'creazione di un file: una volta creato, viene 'prelevata l'ora e il giorno e impostata la 'variabile. Se potesse essere modificata 'non avrebbe più alcun significato Public ReadOnly Property CreationTime() As Date Get Return _CreationTime End Get End Property Public Sub New(ByVal Path As String) _FileName = Path _CreationTime = Date.Now End Sub End Class End Module Una nota sui tipi referenceC'è ancora un'ultima, ma importante, clausola da far notare per le proprietà ReadOnly. Si è gi? vista la differenza tra i tipi value e i tipi reference: i primi contengono un valore, mentre i secondi un puntatore all'area di memoria in cui risiede l'oggetto voluto. A causa di questa particolare struttura, leggere il valore di un tipo reference da una proprietà ReadOnly significa saperne l'indirizzo, il che equivale ad ottenere il valore dell'oggetto puntato. Non è quindi assolutamente sbagliato scrivere:Class ASystem Private _Box As Cube Public ReadOnly Property Box() As Cube Get Return _Box End Get End Property '... End Class '... Dim S As New ASystem() S.Box.SideLength = 4In questo modo, noi staimo effettivamente modificando l'oggetto S.Box, ma indirettamente: non stiamo, invece, cambiando il valore del campo S._Box, che effettivamente è ciò che ci viene impedito di fare. In sostanza, non stiamo assegnando un nuovo oggetto alla variabile S._Box, ma stiamo solo manipolando i dati di un oggetto esistente, e questo è consentito. Anzi, è molto meglio dichiarare proprietà di tipo reference come ReadOnly quando non è necessario assegnare o impostare nuovi oggetti.
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|