Utilisation de structures (Guide de programmation C#)
Le type struct permet de représenter des objets non activables tels que Point, Rectangle et Color. Bien qu'il soit aussi pratique de représenter un point en tant que classe avec Auto-Implemented Properties, un struct peut être plus efficace dans certains scénarios. Par exemple, si vous déclarez un tableau de 1 000 objets Point, vous devez allouer de la mémoire supplémentaire pour faire référence à chacun des objets. Dans ce cas, un struct serait moins onéreux. Étant donné que le .NET Framework contient un objet nommé Point, le struct dans cet exemple est plutôt nommé « CoOrds ».
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
Définir un constructeur par défaut (sans paramètre) pour un struct constitue une erreur. Vous ne devez pas non plus initialiser un champ d'instance dans un corps de struct. Vous pouvez initialiser des membres de struct uniquement en utilisant un constructeur paramétrable ou en accédant individuellement aux membres après que le struct a été déclaré. Tout membre privé ou autrement inaccessible peut être initialisé uniquement dans un constructeur.
Lorsque vous employez l'opérateur new pour créer un objet struct, celui-ci est créé et le constructeur approprié est appelé. Contrairement aux classes, les objets struct peuvent être instanciés sans recours à l'opérateur new. Dans un tel cas, il n'y a aucun appel de constructeur, ce qui rend l'allocation plus efficace. Toutefois, les champs ne seront pas assignés et l'objet ne pourra pas être utilisé tant que tous les champs n'auront pas été initialisés.
Lorsqu'un struct contient un type référence en tant que membre, le constructeur par défaut du membre doit être appelé explicitement, sinon le membre reste non assigné et le struct ne peut pas être utilisé. (Cela provoque une erreur du compilateur CS0171.)
Il n'existe pas d'héritage pour un struct comme il en existe pour une classe. Un struct ne peut pas hériter d'un autre struct ou d'une classe ; il ne peut pas non plus servir de base à une classe. Toutefois, les structures héritent de la classe de base Object. Un struct peut implémenter des interfaces exactement de la même manière que les classes.
Vous ne pouvez pas déclarer une classe à l'aide du mot clé struct. Dans le langage C#, la sémantique des classes et celle des structures sont différentes. Un struct est un type valeur, alors qu'une classe est un type référence. Pour plus d'informations, consultez Types valeur.
À moins que vous ayez besoin de sémantique de type référence, une petite classe peut être contrôlée plus efficacement par le système si vous la déclarez plutôt sous forme de struct.
Exemple 1
Description
Cet exemple illustre l'initialisation du type struct en utilisant les constructeurs par défaut et des constructeurs paramétrables.
Code
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare and initialize struct objects.
class TestCoOrds
{
static void Main()
{
// Initialize:
CoOrds coords1 = new CoOrds();
CoOrds coords2 = new CoOrds(10, 10);
// Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
Console.Write("CoOrds 2: ");
Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
CoOrds 1: x = 0, y = 0
CoOrds 2: x = 10, y = 10
*/
Exemple 2
Description
Cet exemple montre une caractéristique propre aux structures. Il crée un objet CoOrds sans utiliser l'opérateur new. Si vous remplacez le mot struct par le mot class, le programme ne peut pas se compiler.
Code
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
static void Main()
{
// Declare an object:
CoOrds coords1;
// Initialize:
coords1.x = 10;
coords1.y = 20;
// Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: CoOrds 1: x = 10, y = 20
Voir aussi
Référence
Classes et structs (Guide de programmation C#)
Structures (Guide de programmation C#)