Campi (Guida per programmatori C#)

Aggiornamento: novembre 2007

Un campo è una variabile di qualsiasi tipo dichiarata direttamente in una classe o in una struttura. I campi sono membri del rispettivo tipo contenitore.

Una classe o una struttura possono includere campi di istanza, campi statici o entrambi. I campi di istanza sono specifici di un'istanza di un tipo. Se si ha una classe T che include un campo di istanza F, è possibile creare due oggetti di tipo T e modificare il valore di F in ciascun oggetto senza influenzare il valore nell'altro oggetto. Al contrario, un campo statico appartiene alla classe stessa e viene condiviso fra tutte le istanze di quella classe. Le modifiche effettuate dall’istanza A saranno immediatamente visibili sulle istanze B e C, se queste accedono al campo.

Generalmente, i campi devono essere utilizzati solo per variabili con accesso privato o protetto. I dati che la classe espone al codice client devono essere forniti tramite metodi, proprietà e indicizzatori. Utilizzando questi costrutti per l’accesso indiretto ai campi interni, è possibile implementare una protezione contro il passaggio di valori di input non validi. Un campo privato che archivia i dati esposti da una proprietà pubblica viene denominato archivio di backup o campo sottostante.

Generalmente, i campi archiviano dati che devono essere accessibili a più metodi della classe e che devono essere archiviati per periodi di tempo più lunghi della durata di qualsiasi metodo singolo. Ad esempio, una classe che rappresenta una data di calendario potrebbe contenere tre campi integer: uno per il mese, uno per il giorno e uno per l'anno. Le variabili che non vengono utilizzate fuori dall'ambito di un singolo metodo devono essere dichiarate come variabili locali all'interno del corpo del metodo stesso.

I campi vengono dichiarati all'interno del blocco della classe specificando il livello di accesso, quindi il tipo e infine il nome del campo. Esempio:

public class CalendarEntry
{
    // private field
    private DateTime date;

    // public field (Generally not recommended)
    public string day;

    // Public property exposes date field safely.
    public DateTime Date 
    {
        get 
        {
            return date;
        }
        set 
        {
            if(value.Year > 1980 || value.Year <= 2008)
            {
                date = value;
            }
            else
                throw new ArgumentOutOfRangeException();
        }

    }

    // Public method also exposes date field safely.
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Year > 1980 || dt.Year <= 2008)
        {
            date = dt;
        }
        else
            throw new ArgumentOutOfRangeException();            
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt != null && dt.Ticks < date.Ticks)
        {
            return date - dt;
        }
        else
            throw new ArgumentOutOfRangeException();  

    }
}

Per accedere a un campo di un oggetto, aggiungere un punto dopo il nome dell'oggetto, seguito dal nome del campo, come in objectname.fieldname. Esempio:

CalendarEntry birthday = new CalendarEntry();
birthday.day = "Saturday";

A un campo è possibile assegnare un valore iniziale nella relativa dichiarazione utilizzando l'operatore di assegnazione. Per assegnare automaticamente il campo day a "Monday", ad esempio, dichiarare day come indicato nell'esempio seguente:

public class CalendarDateWithInitialization
{
    public string day = "Monday";
    //...
}

I campi vengono inizializzati immediatamente prima della chiamata al costruttore per l'istanza dell'oggetto. Se il costruttore assegna il valore di un campo, verrà sovrascritto qualunque valore specificato nella dichiarazione del campo. Per ulteriori informazioni, vedere Utilizzo di costruttori (Guida per programmatori C#).

Nota:

Un inizializzatore di campo non può fare riferimento ad altri campi di istanza.

I campi possono essere contrassegnati come public, private, protected, internal o protected internal. Questi modificatori definiscono le modalità di accesso ai campi per gli utenti della classe. Per ulteriori informazioni, vedere Modificatori di accesso (Guida per programmatori C#).

È possibile dichiarare un campo come static. In questo modo il campo risulterà sempre disponibile per i chiamanti, anche se non esistono istanze della classe. Per ulteriori informazioni, vedere Classi statiche e membri di classi statiche (Guida per programmatori C#).

È possibile dichiarare un campo come readonly. È possibile assegnare un valore a un campo in sola lettura solo durante l'inizializzazione oppure in un costruttore. Un campo staticreadonly è molto simile a una costante, con la differenza che il compilatore C# non ha accesso al valore di un campo di questo tipo in fase di compilazione, ma solo in fase di esecuzione. Per ulteriori informazioni, vedere Costanti (Guida per programmatori C#).

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le seguenti sezioni incluse in Specifiche del linguaggio C#:

  • 1.6.5 Campi

  • 10.5 Campi

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Classi e strutture (Guida per programmatori C#)

Utilizzo di costruttori (Guida per programmatori C#)

Ereditarietà (Guida per programmatori C#)

Modificatori di accesso (Guida per programmatori C#)

Classi e membri delle classi astratte e sealed (Guida per programmatori C#)