|
| Vediamo in questo articolo quale strumento ci mette a disposizione il C# per esporre all'esterno i campi, o meglio come si unsano le proprieta' |
Le proprietà in C#, ci permettono di esporre verso l'esterno dei campi, di norma infatti è sconsigliabile utilizzare dei campi publici, è meglio semmai utilizzare le proprietà.
La definizione di una proprietà avviene dichiarando una varabile e aprendo subito un blocco all'interno della quale vengono definti i metodi GET e SET, vediamo un esempio:
public class Alunno{
private string nome
public string Nome {
get{
return this.nome;
}
set{
if (value.Length > 0)
{
this.nome = value;
}
else throw new Exception("nome errato");
}
}
}
Come visibile, il metodo get restituisce il valore della variabile locale nome, mentre il metodo set ci passa il valore della variabile all'interno di value così possimo fare le nostre considerazioni prima di utilizzare il nuovo valore.
Naturalmente non è sempre obbliatorio dichiarare tutti e due i metodi GET e SET, se dichiariamo solo il metodo GET avremo, ad esmpio, una variabile in sola lettura.
Indexer
Quando abbiamo la necessità di utilizzare un array della nostra classe, la dichiarazione dei metodi per ricevere e restituire valori cambia leggermente. Prendiamo per esempio il seguente uso della classe mese:
Mese Gennaio = new Mese;
Gennaio[10] = "Compleanno";
A questo punto vediamo come poter realizzare la classe Mese
pubic class Mese{
private string[] giorni = new string[31];
public string this[int numero]{
get{
if (numero > 0 && numero < 32){
return giorni[numero -1];
}
else{
throw new Exception("numero del giorno errato");
}
}
set{
if (numero > 0 && numero < 32){
giorni[numero-1] = value;
}
else{
throw new Exception("numero del giorno errato");
}
}
}
}
Come visibile la sintassi è simile, l'unica cosa è che la variabile bubblica si deve necessariamente chiamare this con il suo indice numerico, per il resto la gestione avviene sempre con imetodi Get e Set.
E' anche possibile sfruttare l'overloading, per sempio dichiarando un this[int numero] ed uno this[string nome]
Delegate
Un delegate è un tipo adatto a contenere un riferimento ad un metodo. quindi io posso inizializzare una classe e poi attribuire un suo metodo ad una variabile di tipo delegate. E' anche possibile attribuire metodi di stanze diverse di una stesse, si parla di delegate multicast.
public delegate string MyHandler();
public class Alunno{
string Nome;
public Alunno(string Nome){
this.Nome = Nome;
}
public string Visualizza(){
return this.Nome;
}
}
public class Prova{
public static void Main(){
Alunno a1 = new Alunno ("Marco");
Alunno a2 = new Alunno ("Luca");
Alunno a3 = new Alunno ("Giovanni");
MyHandler VisualizzaTutto = new MyHandler(a1.Visualizza);
VisualizzaTutto = VisualizzaTutto + new MyHandler(a2.Visualizza);
VisualizzaTutto = VisualizzaTutto + new MyHandler(a3.Visualizza);
Console.WriteLine(VisualizzaTutto);
}
}
L'output dell'esecuzione di questo programma sarà:
>Giovanni
Questo perchè tutti e tre i metodi visualizza vengono richiamati (delegate multicast) il problema è che la variabile che ci viene restituita è ovvimente la somma degli effetti delle 3 esecuzioni e quindo il valore di a3.
|
|