Proprietà (Guida per programmatori C#)Properties (C# Programming Guide)

Una proprietà è un membro che fornisce un meccanismo flessibile per leggere, scrivere o calcolare il valore di un campo privato.A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field. Le proprietà possono essere usate come se fossero membri dati pubblici, ma sono in realtà metodi speciali denominati funzioni di accesso.Properties can be used as if they are public data members, but they are actually special methods called accessors. Questo consente di accedere facilmente ai dati e di alzare di livello la sicurezza e la flessibilità dei metodi.This enables data to be accessed easily and still helps promote the safety and flexibility of methods.

Panoramica delle proprietàProperties overview

  • Le proprietà consentono a una classe di esporre un modo pubblico per ottenere e impostare i valori, nascondendo però il codice di implementazione o di verifica.Properties enable a class to expose a public way of getting and setting values, while hiding implementation or verification code.

  • Una funzione di accesso della proprietà get viene usata per restituire il valore della proprietà, mentre una funzione di accesso della proprietà set viene usata per assegnare un nuovo valore.A get property accessor is used to return the property value, and a set property accessor is used to assign a new value. Queste funzioni di accesso possono avere diversi livelli di accesso.These accessors can have different access levels. Per altre informazioni, vedere Limitazione dell'accessibilità delle funzioni di accesso.For more information, see Restricting Accessor Accessibility.

  • La parola chiave value viene usata per definire il valore che deve essere assegnato dalla funzione di accesso set.The value keyword is used to define the value being assigned by the set accessor.

  • Le proprietà possono essere di lettura/scrittura con entrambe le funzione di accesso get e set, di sola lettura con la funzione di accesso get e senza la funzione di accesso set o di sola scrittura con la funzione di accesso set e senza la funzione di accesso get.Properties can be read-write (they have both a get and a set accessor), read-only (they have a get accessor but no set accessor), or write-only (they have a set accessor, but no get accessor). Le proprietà di sola scrittura sono rare e vengono in genere usate per limitare l'accesso ai dati sensibili.Write-only properties are rare and are most commonly used to restrict access to sensitive data.

  • Le proprietà semplici che non richiedono alcun codice di funzione di accesso personalizzata possono essere implementate come definizioni del corpo dell'espressione o come proprietà implementate automaticamente.Simple properties that require no custom accessor code can be implemented either as expression body definitions or as auto-implemented properties.

Proprietà con campi sottostantiProperties with backing fields

Un modello di base per l'implementazione di una proprietà prevede l'uso di un campo sottostante privato per l'impostazione e il recupero del valore della proprietà.One basic pattern for implementing a property involves using a private backing field for setting and retrieving the property value. La funzione di accesso get restituisce il valore del campo privato e la funzione di accesso set può eseguire una convalida dei dati prima di assegnare un valore al campo privato.The get accessor returns the value of the private field, and the set accessor may perform some data validation before assigning a value to the private field. Entrambe le funzioni di accesso possono anche eseguire una conversione o un calcolo nei dati prima che vengano archiviati o restituiti.Both accessors may also perform some conversion or computation on the data before it is stored or returned.

L'esempio seguente illustra il modello.The following example illustrates this pattern. Nell'esempio la classe TimePeriod rappresenta un intervallo di tempo.In this example, the TimePeriod class represents an interval of time. Internamente la classe archivia l'intervallo di tempo in secondi in un campo privato denominato _seconds.Internally, the class stores the time interval in seconds in a private field named _seconds. Una proprietà di lettura/scrittura denominata Hours consente al cliente di specificare l'intervallo di tempo in ore.A read-write property named Hours allows the customer to specify the time interval in hours. Entrambe le funzioni di accesso get e set eseguono la conversione necessaria tra ore e secondi.Both the get and the set accessors perform the necessary conversion between hours and seconds. Inoltre, la funzione di accesso set convalida i dati e genera ArgumentOutOfRangeException se il numero di ore non è valido.In addition, the set accessor validates the data and throws an ArgumentOutOfRangeException if the number of hours is invalid.

using System;

class TimePeriod
{
   private double _seconds;

   public double Hours
   {
       get { return _seconds / 3600; }
       set { 
          if (value < 0 || value > 24)
             throw new ArgumentOutOfRangeException(
                   $"{nameof(value)} must be between 0 and 24.");

          _seconds = value * 3600; 
       }
   }
}

class Program
{
   static void Main()
   {
       TimePeriod t = new TimePeriod();
       // The property assignment causes the 'set' accessor to be called.
       t.Hours = 24;

       // Retrieving the property causes the 'get' accessor to be called.
       Console.WriteLine($"Time in hours: {t.Hours}");
   }
}
// The example displays the following output:
//    Time in hours: 24

Definizioni del corpo dell'espressioneExpression body definitions

Le funzioni di accesso delle proprietà sono spesso costituite da istruzioni a riga singola che assegnano o restituiscono il risultato di un'espressione.Property accessors often consist of single-line statements that just assign or return the result of an expression. È possibile implementare queste proprietà come membri con corpo di espressione.You can implement these properties as expression-bodied members. Le definizioni del corpo dell'espressione sono costituite dal simbolo => seguito dall'espressione per l'assegnazione o il recupero dalla proprietà.Expression body definitions consist of the => symbol followed by the expression to assign to or retrieve from the property.

A partire da C# 6, le proprietà di sola lettura possono implementare la funzione di accesso get come membro con corpo di espressione.Starting with C# 6, read-only properties can implement the get accessor as an expression-bodied member. In questo caso non viene usata la parola chiave della funzione di accesso get né la parola chiave return.In this case, neither the get accessor keyword nor the return keyword is used. L'esempio seguente implementa la proprietà Name di sola lettura come membro con corpo di espressione.The following example implements the read-only Name property as an expression-bodied member.

using System;

public class Person
{
   private string _firstName;
   private string _lastName;
   
   public Person(string first, string last)
   {
      _firstName = first;
      _lastName = last;
   }

   public string Name => $"{_firstName} {_lastName}";   
}

public class Example
{
   public static void Main()
   {
      var person = new Person("Isabelle", "Butts");
      Console.WriteLine(person.Name);
   }
}
// The example displays the following output:
//      Isabelle Butts

A partire da C# 7.0, entrambe le funzioni di accesso get e set possono essere implementate come membri con corpo di espressione.Starting with C# 7.0, both the get and the set accessor can be implemented as expression-bodied members. In questo caso, è necessario che siano presenti le parole chiave get e set.In this case, the get and set keywords must be present. L'esempio seguente illustra l'uso di definizioni del corpo dell'espressione per entrambe le funzioni di accesso.The following example illustrates the use of expression body definitions for both accessors. Si noti che la parola chiave return non viene usata con la funzione di accesso get.Note that the return keyword is not used with the get accessor.

using System;

public class SaleItem
{
   string _name;
   decimal _cost;
   
   public SaleItem(string name, decimal cost)
   {
      _name = name;
      _cost = cost;
   }

   public string Name 
   {
      get => _name;
      set => _name = value;
   }

   public decimal Price
   {
      get => _cost;
      set => _cost = value; 
   }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem("Shoes", 19.95m);
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



Proprietà implementate automaticamenteAuto-implemented properties

In alcuni casi, le funzioni di accesso get e set delle proprietà si limitano ad assegnare o a recuperare un valore da un campo sottostante senza includere alcuna logica aggiuntiva.In some cases, property get and set accessors just assign a value to or retrieve a value from a backing field without including any additional logic. Usando le proprietà implementate automaticamente è possibile semplificare il codice e fare in modo che il compilatore C# specifichi automaticamente in modo trasparente il campo sottostante.By using auto-implemented properties, you can simplify your code while having the C# compiler transparently provide the backing field for you.

Se una proprietà ha entrambe le funzioni di accesso get e set, entrambe le funzioni devono essere implementate automaticamente.If a property has both a get and a set accessor, both must be auto-implemented. È possibile definire una proprietà implementata automaticamente usando le parole chiave get e set senza specificare alcuna implementazione.You define an auto-implemented property by using the get and set keywords without providing any implementation. L'esempio seguente ripete l'esempio precedente, ad eccezione del fatto che Name e Price sono proprietà implementate automaticamente.The following example repeats the previous one, except that Name and Price are auto-implemented properties. Si noti che l'esempio rimuove anche il costruttore con parametri in modo che gli oggetti SaleItem vengano ora inizializzati con una chiamata al costruttore senza parametri e un inizializzatore di oggetto.Note that the example also removes the parameterized constructor, so that SaleItem objects are now initialized with a call to the parameterless constructor and an object initializer.

using System;

public class SaleItem
{
   public string Name 
   { get; set; }

   public decimal Price
   { get; set; }
}

class Program
{
   static void Main(string[] args)
   {
      var item = new SaleItem{ Name = "Shoes", Price = 19.95m };
      Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
   }
}
// The example displays output like the following:
//       Shoes: sells for $19.95



Specifiche del linguaggio C#C# Language Specification

Per altre informazioni, vedere Tipi integrali in Specifica del linguaggio C#.For more information, see Properties in the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee also