Procedura: dichiarare e usare proprietà Read Write (Guida per programmatori C#)
Le proprietà offrono i vantaggi dei membri dati pubblici senza i rischi associati all'accesso non protetto, non controllato e non verificato ai dati di un oggetto. Le proprietà dichiarano funzioni di accesso: metodi speciali che assegnano e recuperano valori dal membro dati sottostante. La funzione di accesso set consente l'assegnazione di valori ai membri dati, mentre la funzione di accesso get recupera i valori dei membri dati.
Questo esempio mostra una classe Person
con due proprietà: Name
(string) e Age
(int). Entrambe le proprietà forniscono le funzioni di accesso get
e set
, quindi vengono considerate proprietà di lettura/scrittura.
Esempio
class Person
{
private string _name = "N/A";
private int _age = 0;
// Declare a Name property of type string:
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
// Declare an Age property of type int:
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
}
public override string ToString()
{
return "Name = " + Name + ", Age = " + Age;
}
}
public class Wrapper
{
private string _name = "N/A";
public string Name
{
get
{
return _name;
}
private set
{
_name = value;
}
}
}
class TestPerson
{
static void Main()
{
// Create a new Person object:
Person person = new Person();
// Print out the name and the age associated with the person:
Console.WriteLine("Person details - {0}", person);
// Set some values on the person object:
person.Name = "Joe";
person.Age = 99;
Console.WriteLine("Person details - {0}", person);
// Increment the Age property:
person.Age += 1;
Console.WriteLine("Person details - {0}", person);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Person details - Name = N/A, Age = 0
Person details - Name = Joe, Age = 99
Person details - Name = Joe, Age = 100
*/
Programmazione efficiente
Nell'esempio precedente le proprietà Name
e Age
sono di tipo public e includono entrambe le funzioni di accesso get
e set
. Le funzioni di accesso pubbliche consentono a qualsiasi oggetto di leggere e scrivere queste proprietà. A volte è tuttavia preferibile escludere una delle funzioni di accesso. È possibile omettere la funzione di accesso set
per rendere la proprietà di sola lettura:
public string Name
{
get
{
return _name;
}
private set
{
_name = value;
}
}
In alternativa è possibile esporre pubblicamente una funzione di accesso ma rendere l'altra privata o protetta. Per altre informazioni, vedere Accessibilità asimmetrica delle funzioni di accesso.
Una volta dichiarate le proprietà, è possibile usarle come campi della classe. Le proprietà consentono una sintassi naturale quando si ottiene e si imposta il valore di una proprietà, come nelle istruzioni seguenti:
person.Name = "Joe";
person.Age = 99;
In un metodo set
di una proprietà è disponibile una variabile value
speciale. Questa variabile contiene il valore specificato dall'utente, ad esempio:
_name = value;
Si noti la semplice sintassi per incrementare la proprietà Age
di un oggetto Person
:
person.Age += 1;
Se per modellare le proprietà venissero usati metodi set
e get
distinti, il codice equivalente sarebbe simile al seguente:
person.SetAge(person.GetAge() + 1);
In questo esempio viene eseguito l'override del metodo ToString
:
public override string ToString()
{
return "Name = " + Name + ", Age = " + Age;
}
Si noti che il metodo ToString
non viene usato in modo esplicito nel programma. Viene richiamato per impostazione predefinita dalle chiamate a WriteLine
.