Proprietà complete con campi di supporto
Aggiunga la logica ai getter e ai setter.
Proprietà complete con campi di supporto è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Oltre le proprietà automatiche
Quando serve inserire della logica all'interno di get o set, si scrive una proprietà completa con un campo di supporto esplicito. Il campo archivia i dati, mentre gli accessor ne controllano l'accesso.
using System;
class Temperature
{
private double _celsius;
public double Celsius
{
get { return _celsius; }
set { _celsius = value; }
}
}
class Program
{
static void Main()
{
var t = new Temperature();
t.Celsius = 21.5;
Console.WriteLine(t.Celsius);
}
}Convenzione per i campi di supporto
Per convenzione, un campo di supporto è private e ha un nome che inizia con un carattere di sottolineatura, come _name. La proprietà pubblica lo espone.
using System;
class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
class Program
{
static void Main()
{
var p = new Person();
p.Name = "Grace";
Console.WriteLine(p.Name);
}
}La parola chiave value
All'interno di un accessor set, il parametro implicito value contiene il valore assegnato in ingresso. Spetta a Lei decidere come gestirlo.
using System;
class Box
{
private int _size;
public int Size
{
get { return _size; }
set { _size = value * 2; }
}
}
class Program
{
static void Main()
{
var box = new Box();
box.Size = 10;
Console.WriteLine("Stored size: " + box.Size);
}
}Convalida nel setter
Un uso comune di una proprietà completa consiste nel convalidare l'input prima di archiviarlo, generando un'eccezione se il valore non è valido.
using System;
class Account
{
private decimal _balance;
public decimal Balance
{
get { return _balance; }
set
{
if (value < 0)
throw new ArgumentException("Balance cannot be negative");
_balance = value;
}
}
}
class Program
{
static void Main()
{
var a = new Account();
a.Balance = 500m;
Console.WriteLine("Balance: " + a.Balance);
}
}Proprietà calcolate in sola lettura
Una proprietà con il solo get può calcolare il proprio valore a partire da altri campi. Non esiste alcun campo di supporto perché non viene archiviato nulla.
using System;
class Rectangle
{
private double _width;
private double _height;
public Rectangle(double w, double h)
{
_width = w;
_height = h;
}
public double Area
{
get { return _width * _height; }
}
}
class Program
{
static void Main()
{
var r = new Rectangle(4, 5);
Console.WriteLine("Area: " + r.Area);
}
}Effetti collaterali nei setter
Un setter può fare più che archiviare un valore: può normalizzare l'input, aggiornare lo stato correlato o registrare le modifiche.
using System;
class User
{
private string _email;
public string Email
{
get { return _email; }
set { _email = value.Trim().ToLower(); }
}
}
class Program
{
static void Main()
{
var u = new User();
u.Email = " Hello@Example.COM ";
Console.WriteLine("Normalized: " + u.Email);
}
}Calcolo differito nel getter
Un getter può memorizzare nella cache di un campo di supporto un risultato costoso da calcolare, alla prima richiesta.
using System;
class Report
{
private string _cached;
public string Content
{
get
{
if (_cached == null)
_cached = "Generated at runtime";
return _cached;
}
}
}
class Program
{
static void Main()
{
var r = new Report();
Console.WriteLine(r.Content);
Console.WriteLine(r.Content);
}
}Proteggersi dagli stati non validi
Combini un campo di supporto con della logica per mantenere sempre valido un oggetto. In questo caso, il setter limita il valore a un intervallo.
using System;
class Volume
{
private int _level;
public int Level
{
get { return _level; }
set
{
if (value < 0) _level = 0;
else if (value > 100) _level = 100;
else _level = value;
}
}
}
class Program
{
static void Main()
{
var v = new Volume();
v.Level = 150;
Console.WriteLine("Clamped: " + v.Level);
}
}Combinare dati archiviati e calcolati
Una classe spesso combina proprietà che archiviano dati, con campi di supporto, e proprietà calcolate in sola lettura derivate da esse.
using System;
class Employee
{
private string _first;
private string _last;
public string First { get { return _first; } set { _first = value; } }
public string Last { get { return _last; } set { _last = value; } }
public string FullName { get { return _first + " " + _last; } }
}
class Program
{
static void Main()
{
var e = new Employee { First = "Marie", Last = "Curie" };
Console.WriteLine(e.FullName);
}
}Generare notifiche delle modifiche
I setter sono il punto naturale in cui notificare le modifiche ai dati, secondo uno schema ampiamente utilizzato nei framework per interfacce utente.
using System;
class Model
{
private int _count;
public int Count
{
get { return _count; }
set
{
if (_count != value)
{
_count = value;
Console.WriteLine("Count changed to " + _count);
}
}
}
}
class Program
{
static void Main()
{
var m = new Model();
m.Count = 1;
m.Count = 1;
m.Count = 2;
}
}Mettere tutto insieme
Le proprietà complete permettono a una classe di imporre invarianti ed esporre dati derivati, il tutto tramite un'interfaccia pulita simile a quella di un campo.
using System;
class Thermostat
{
private double _target;
public double Target
{
get { return _target; }
set { _target = value < 10 ? 10 : value; }
}
public string Status { get { return _target >= 22 ? "Warm" : "Cool"; } }
}
class Program
{
static void Main()
{
var th = new Thermostat();
th.Target = 5;
Console.WriteLine(th.Target + " -> " + th.Status);
th.Target = 24;
Console.WriteLine(th.Target + " -> " + th.Status);
}
}Verifica rapida
Verifichi la Sua comprensione delle proprietà complete.
Riepilogo
Una proprietà completa associa un campo di supporto privato ad accessor get/set espliciti, consentendo di aggiungere convalida, normalizzazione, memorizzazione nella cache o notifiche delle modifiche. Le proprietà calcolate in sola lettura hanno solo un getter e non hanno un campo di supporto. La parola chiave value contiene il valore assegnato in ingresso all'interno di un setter.
using System;
class Demo
{
private int _n;
public int N
{
get { return _n; }
set { _n = value < 0 ? 0 : value; }
}
public int Doubled { get { return _n * 2; } }
}
class Program
{
static void Main()
{
var d = new Demo();
d.N = -5;
Console.WriteLine(d.N + ", " + d.Doubled);
}
}Domande Frequenti
La lezione «Proprietà complete con campi di supporto» è gratuita?
Sì — il testo completo di «Proprietà complete con campi di supporto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Proprietà complete con campi di supporto»?
Aggiunga la logica ai getter e ai setter. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Proprietà complete con campi di supporto»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Proprietà implementate automaticamente
- Proprietà complete con campi di supporto
- Membri con corpo a espressione
- Indexer