Nelle classi di esempio utilizzate nella precedente lezione, abbiamo utilizzato dei campi istanza (variabili della classe) che avevano il modificatore di accesso public con il quale il codice esterno alla classe poteva accedere direttamente ai loro valori.

Nella normale programmazione orientata agli oggetti, è consigliabile garantire una maggiore "ristrettezza" riguardo l’accesso ai campi istanza della classe. Con ristrettezza si intende cioè "mascherare" la natura e la struttura dei campi inclusi nella classe. L’utilizzatore della classe non deve interessarsi di come sono stati creati e/o manipolati i campi istanza dell’oggetto che dovrà gestire all’interno di una applicazione, ma li dovrà solamente utilizzare.

I progettisti di una classe, nascondono, rendendoli privati, tutti (o quasi) i campi istanza di una classe.

La domanda nasce spontanea: "Se i campi vengono dichiarati privati (private), come si possono utilizzare all’interno di una applicazione se non possiamo accedervi?"

Il C# mette a disposizione un costrutto particolare creato ad hoc per poter accedere indirettamente ai campi istanza di una classe: le proprietà.

Con le proprietà, siamo in grado di accedere ai campi istanza sia in lettura che in scrittura; questa è la sintassi:

public tipo nome_proprietà
 {
    get
           {  
              return nome_campo;
           }
    set
           { 
               nome_campo=value;
           } 
 }

 

La segnatura indica che la proprietà è public, quindi accessibile dal codice esterno alla classe, è dichiarata di un tipo tra quelli consentiti dal linguaggio e che è in stretta relazione con quello del campo istanza a cui farà riferimento ed infine ha un nome.

Le parole chiave get e set consentono l’effettivo accesso al campo istanza ed in particolare con

get

saremo in grado di leggere il contenuto del campo. Nel suo blocco di codice noterete la parola chiave return. Essa ci ritorna il valore del campo nome_campo (tra breve vedremo come).

Mentre con

set

saremo in grado di assegnare un preciso valore al campo nome_campo tramite la parola chiave value.

Come al solito la teoria deve necessariamente lasciare spazio alla pratica che svelerà molto semplicemente i "retroscena" dell’uso delle proprietà.

Riprendiamo la classe Studente della lezione precedente e che qui riporto:

 

class Studente  
    {
 
         // campi istanza della classe
        public string nome;
        public string cognome;
        
    }

ora la trasformeremo aggiungendovi due proprietà.

Per prima cosa eliminiamo il modificatore public rendendo entrambi i campi privati. Vi ricordo che se ad un campo non diamo nessun modificatore di accesso, il campo diventa automaticamente private. Ora la classe si presenta così:

class Studente  
    {
 
         // campi istanza privati della classe
         string nome;
         string cognome;
        
    }

Inseriamo le proprietà relative ai campi:

 class Studente
     {

         // campi istanza privati della classe
        string nome;
        string cognome;
        
        // definisco la proprietà per il campo nome
      
       public string st_nome // è dello stesso tipo del campo istanza
            {
               get   // per la lettura
                       {
                          return nome; // ritorna il valore stringa del campo
                        } 
               set   // per l’assegnazione
                       {
                          nome=value; // assegno un valore stringa al campo
                        }
             }
         
            // definisco la proprietà per il campo cognome
 
           public string st_cognome // è dello stesso tipo del campo istanza
                {
                  get   // per la lettura
                          {
                              return cognome; // ritorna il  valore stringa del campo
                           }
                  set    // per l’assegnazione
                           {
                               cognome=value; // assegno un valore stringa al campo
                            }
                 }
         
   }   // fine blocco di codice della classe

La classe è terminata ed è pronta all’uso. Ma ora che i campi istanza sono "spariti", in che modo le proprietà verranno utilizzate nel codice ?

Le proprietà, come avete imparato, hanno un nome ed è proprio tramite il nome che accederemo ai campi. Le proprietà possono essere considerate come semplici variabili e come tali verranno usate nel codice.

Normalmente quando assegniamo un valore ad una variabile siamo soliti scrivere, per esempio:

numero=124;

oppure se vogliamo leggerne il contenuto scriviamo:

num_libri=numero;

con le proprietà faremo la stessa cosa ma con la variante che, avendo a che fare con un oggetto, dobbiamo utilizzare la notazione puntata (operatore punto); per esempio se abbiamo istanziato un oggetto Alunno tramite la classe Studente e vogliamo assegnargli un nome ed un cognome faremo così:

// per il nome
Alunno.st_nome="Valentino";

// per il cognome
Alunno.st_cognome="Rossi";

queste due istruzioni, hanno effettuato una assegnazione di un valore per i campi privati della classe richiamando automaticamente il costrutto set attraverso le rispettive proprietà (st_nome e st_cognome).

Al contrario, se vogliamo leggere i valori contenuti nei campi privati della classe faremo cosi, per esempio:

// per il nome
Console.WriteLine(Alunno.st_nome);

// per il cognome
Console.WriteLine(Alunno.st_cognome);

le istruzioni richiamano automaticamente il costrutto get delle rispettive proprietà che ci ritonerà il valore del campo privato associato tramite la parola chiave return.

E’ arrivato il momento di vedere in azione la nuova classe con questo semplice programmino. Copiate il listato, compilatelo e lanciatelo.

 // questo programma usa la classe Studente modificata

using System;
 
class Studente 
   {
 
      // campi istanza privati della classe
      string nome;
      string cognome;
 
      // definisco la proprietà per il campo nome
 
      public string st_nome // è dello stesso tipo del campo istanza
              {
                 get  // per la lettura
                        {
                           return nome; // ritorna il valore stringa del campo
                        }
                
                 set   // per l’assegnazione
                       {
                          nome=value; // assegno un valore stringa al campo
                        }
 

// definisco la proprietà per il campo cognome

public string st_cognome // è dello stesso tipo del campo istanza { get // per la lettura { return cognome; // ritorna il valore stringa del campo } set // per l’assegnazione { cognome=value; // assegno un valore stringa al campo } }

} // fine blocco di codice della classe class Alunno2 // il programma { public static void Main() { // istanzio la classe Studente Alunno = new Studente(); // valorizzo le proprietà dell’oggetto Alunno.st_nome = "Valentino"; Alunno.st_cognome = "Rossi"; // stampo i valori dei campi Console.WriteLine("\nIl nome dell’alunno è {0} {1}", Alunno.st_nome , Alunno.st_cognome); // attendo un carattere qualsiasi // digitato per chiudere il programma Console.ReadLine(); } // chiude il Main() } // chiude il programma

Nella prossima lezione parleremo dei metodi.

Pagina precedente - Pagina successiva