Costruttori di istanze (Guida per programmatori C#)
I costruttori di istanza sono utilizzati per creare e inizializzare qualsiasi variabile membro di istanza quando si utilizza l'espressione new per creare un oggetto di una classe.Per inizializzare una classe statica o variabili statiche in una classe non statica, è necessario definire un costruttore statico.Per ulteriori informazioni, vedere Costruttori statici (Guida per programmatori C#).
Nell'esempio seguente viene illustrato un costruttore di istanza:
class CoOrds
{
public int x, y;
// constructor
public CoOrds()
{
x = 0;
y = 0;
}
}
[!NOTA]
Per maggior chiarezza, questa classe contiene campi pubblici.L'utilizzo di campi pubblici non è consigliato nella programmazione, perché consente a qualsiasi metodo in un punto qualsiasi di un programma di accedere senza restrizioni e senza alcuna verifica ai meccanismi interni di un oggetto.I membri dati devono in genere essere privati e devono essere accessibili solo tramite metodi e proprietà di classi.
Questo costruttore di istanza viene chiamato quando viene creato un oggetto basato sulla classe CoOrds.Un costruttore come questo, che non accetta argomenti, viene definito costruttore predefinito.Tuttavia, risulta spesso utile per fornire costruttori aggiuntivi.È ad esempio possibile aggiungere alla classe CoOrds un costruttore che consenta di specificare i valori iniziali per i membri dati:
// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
In questo modo sarà possibile creare oggetti CoOrd con valori iniziali predefiniti o specifici, come illustrato di seguito:
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
Se una classe non dispone di un costruttore, viene generato automaticamente un costruttore predefinito e per inizializzare i campi dell'oggetto vengono utilizzati i valori predefiniti.Ad esempio, un int viene inizializzato a 0.Per ulteriori informazioni sui valori predefiniti, vedere Tabella dei valori predefiniti (Riferimenti per C#).Poiché il costruttore predefinito della classe CoOrds inizializza tutti i membri dati su zero, può pertanto essere rimosso completamente senza modificare il funzionamento della classe.Per un esempio completo sull'utilizzo di più costruttori, vedere l'Esempio 1 più avanti in questo argomento. Per un esempio di costruttore generato automaticamente, vedere l'Esempio 2.
I costruttori di istanza possono inoltre essere utilizzati per chiamare i costruttori di istanza delle classi base.Il costruttore di classi può richiamare il costruttore della classe base mediante l'inizializzatore, ad esempio:
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
}
In questo esempio la classe Circle passa i valori che rappresentano il raggio e l'altezza al costruttore fornito da Shape, da cui deriva Circle.Per un esempio completo sull'utilizzo di Shape e Circle, vedere l'Esempio 3 di questo argomento.
Esempio 1
Nell'esempio riportato di seguito viene illustrata una classe con due costruttori di classi, uno senza argomenti e uno con due argomenti.
class CoOrds
{
public int x, y;
// Default constructor:
public CoOrds()
{
x = 0;
y = 0;
}
// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
// Override the ToString method:
public override string ToString()
{
return (String.Format("({0},{1})", x, y));
}
}
class MainClass
{
static void Main()
{
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
// Display the results using the overriden ToString method:
Console.WriteLine("CoOrds #1 at {0}", p1);
Console.WriteLine("CoOrds #2 at {0}", p2);
Console.ReadKey();
}
}
/* Output:
CoOrds #1 at (0,0)
CoOrds #2 at (5,3)
*/
Esempio 2
Nell'esempio riportato di seguito la classe Person non ha alcun costruttore. In questo caso viene fornito automaticamente un costruttore predefinito e i campi vengono inizializzati sui valori predefiniti.
public class Person
{
public int age;
public string name;
}
class TestPerson
{
static void Main()
{
Person person = new Person();
Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: Name: , Age: 0
Si noti che il valore predefinito di age è 0 e il valore predefinito di name è null.Per ulteriori informazioni sui valori predefiniti, vedere Tabella dei valori predefiniti (Riferimenti per C#).
Esempio 3
Nell'esempio riportato di seguito viene illustrato l'utilizzo dell'inizializzatore della classe base.La classe Circle è derivata dalla classe generale Shape e la classe Cylinder è derivata dalla classe Circle.Il costruttore di ciascuna classe derivata utilizza il relativo inizializzatore della classe base.
abstract class Shape
{
public const double pi = Math.PI;
protected double x, y;
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public abstract double Area();
}
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
public override double Area()
{
return pi * x * x;
}
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area()
{
return (2 * base.Area()) + (2 * pi * x * y);
}
}
class TestShapes
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
Circle ring = new Circle(radius);
Cylinder tube = new Cylinder(radius, height);
Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Area of the circle = 19.63
Area of the cylinder = 86.39
*/
Per ulteriori esempi su come richiamare i costruttori della classe base, vedere virtual (Riferimenti per C#), override (Riferimenti per C#) e base (Riferimenti per C#).
Vedere anche
Riferimenti
Classi e struct (Guida per programmatori C#)
Costruttori (Guida per programmatori C#)
Distruttori (Guida per programmatori C#)