Nella programmazione orientata agli oggetti esporre pubblicamente i campi di una classe "nudi e crudi" è sconsigliato in quanto se in futuro si volessero implementare delle verifiche sui suddetti campi (ad esempio assicurarsi che rientrino in un range e lanciare un eccezione in caso contrario) diventa più complicato. La soluzione consiste nell'incapsulare i campi che si vogliono esporre in un metodo getter ed eventualmente se si vuole permettere all'utente la modifica di un campo in un setter.
Java e C++ impongono un approccio "tradizionale" e molto verboso al problema ad esempio:
Double x = triangolo.getBase();
triangolo.setAltezza(y);
C# offre una soluzione più elegante al problema
using System;
class Persona{
public string Nome_Cognome{get;set;}
//Inserendo [accesso] [tipo] [nome_campo]{get;set;} si ottiene una proprietà automatica che offre dei semplici getters/setters di default che eventualmente possono essere arricchiti in futuro
public DateTime DataNascita{
get{
return DataNascita;
}
set{
if(DataNascita > DateTime.Now){
throw(new ArgumentException());
}
else{
DataNascita = value;
}
}
}
//Questo secondo costruttore è stato affinchè il getters funzioni normalmente mentre il setter verifichi la data inserita prima di settarla
public TimeSpan eta{
get{
return DateTime.Now - DataNascita;
}
}
//Le proprietà possono essere anche di sola lettura (o scrittura) e non linkate ad alcun campo ma "virtuali"
}
Nel codice le proprietà si usano come normali variabili ad esempio
Persona prova = new Persona();
prova.Nome_Cognome="Emiliano Sandri";
prova.DataNascita= new DateTime(1998,9,23,0,0,0);
Console.WriteLine(prova.eta);