Condividi tramite


Procedura: dichiarare e utilizzare le proprietà Read/Write (Guida per programmatori C#)

Aggiornamento: novembre 2007

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. Ciò si ottiene tramite le funzioni di accesso, ossia 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 presenta 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à in 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;
    }
}

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 pubbliche e comprendono una funzione di accesso get e una funzione di accesso set. In questo modo qualsiasi oggetto può leggere e scrivere tali proprietà. È a volte preferibile, tuttavia, escludere una delle funzioni di accesso. Se ad esempio la funzione di accesso set viene omessa, la proprietà diventa in sola lettura:

public string Name
{
    get
    {
        return name;
    }
}

In alternativa è possibile esporre una funzione di accesso pubblicamente ma rendere l'altra privata o protetta. Per ulteriori informazioni, vedere Accessibilità asimmetrica delle funzioni di accesso.

Una volta dichiarate le proprietà, è possibile utilizzare questi metodi come se si trattasse di campi della classe. Questo consente di utilizzare una sintassi molto semplice quando si desidera ottenere o impostare il valore di una proprietà, come nelle seguenti istruzioni:

person.Name = "Joe";
person.Age = 99;

Tenere presente che in un metodo set di una proprietà è disponibile una variabile value speciale. Tale variabile contiene il valore specificato dall'utente, ad esempio:

name = value;

La sintassi per l'incremento della proprietà Age per un oggetto Person è molto semplice:

person.Age += 1;

Se si utilizzassero due metodi set e get distinti per impostare le proprietà, sarebbe necessaria una stringa di codice del seguente tipo:

person.SetAge(person.GetAge() + 1); 

In questo esempio viene eseguito l'override del metodo ToString:

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

Il metodo ToString non è utilizzato in modo esplicito nel programma, ma viene richiamato per impostazione predefinita dalle chiamate a WriteLine.

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Proprietà (Guida per programmatori C#)

Classi e strutture (Guida per programmatori C#)