Comment travailler avec des structures en C #

Bien qu'il existe de nombreuses similitudes entre une classe et une structure, il existe également des différences distinctes. Plus important encore, une structure, contrairement à une classe, est un type valeur. Ainsi, alors que les instances d'une classe sont stockées dans le tas, les instances d'une structure sont stockées dans la pile.

Lorsqu'une instance d'une structure est passée à une méthode, elle est toujours passée par valeur. Ceci est en contraste avec ce qui se produit lorsque nous passons une instance d'une classe à une méthode - l'instance est passée par référence.

Programmation de structures en C #

Voici à quoi ressemble la syntaxe pour déclarer une structure.

struct

{

//Data members and member functions of the struct

}

The following code snippet shows how a typical struct definition looks like.

struct Rectangle

    {

        public int width;

        public int height;

    }

Vous pouvez maintenant attribuer des valeurs aux membres de la structure que vous avez définie précédemment, comme indiqué dans l'extrait de code ci-dessous.

Rectangle rectangle = new Rectangle();

rectangle.width = 10;

rectangle.height = 15;

L'extrait de code ci-dessus crée une instance de la structure Rectangle et attribue des valeurs aux membres publics de celle-ci. Notez que vous pouvez avoir à la fois des données de membre et des méthodes dans une structure. En outre, vous pouvez spécifier les membres comme privés, publics et internes. Il convient de noter que contrairement aux classes, vous ne pouvez pas avoir d'initialiseurs de champ pour les champs non statiques dans les structs. Par conséquent, les instructions telles que les suivantes dans une structure ne sont pas valides.

int width = 10;

int height = 15;

Vous pouvez quand même initialiser des membres statiques dans vos structures. Par conséquent, ce qui suit est une instruction valide à l'intérieur d'une structure.

static int area = 0;

Ajoutons maintenant quelques méthodes à la structure. Voici la version mise à jour de la structure Rectangle que nous avons créée précédemment. Notez l'utilisation du constructeur paramétré.

struct Rectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Notez que même si une structure ne vous permet pas de définir un constructeur sans paramètre explicite à l'intérieur, vous pouvez toujours avoir des constructeurs de paramètres dans une structure. De même, comme pour une classe, vous pouvez également avoir des constructeurs surchargés dans une structure. Voici comment définir des valeurs à l'aide du constructeur de la structure Rectangle, puis obtenir la zone en appelant la méthode GetArea (). Il convient de noter que, comme pour une classe, vous pouvez avoir des méthodes statiques et non statiques dans une structure.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(10, 15);

            int area = rectangle.GetArea();

            Console.WriteLine("The area is: " + area.ToString());

            Console.Read();

        }

Comme une classe, une structure prend en charge les propriétés et les indexeurs. Une différence majeure entre une structure et une classe est que, contrairement à une classe, une structure ne prend pas en charge l'héritage - vous ne pouvez pas avoir de structure qui étend une autre classe ou une structure. Cependant, semblable à une classe, une structure peut implémenter une interface. Voici un exemple de code qui illustre cela.

 interface IRectangle

    {

        int GetArea();

    }

  struct Rectangle : IRectangle

    {

        int width;

        int height;

        public Rectangle(int width, int height)

        {

            this.width = width;

            this.height = height;

        }

        public int GetArea()

        {

            return this.width * this.height;

        }

    }

Choisir entre une classe et une structure

Nous arrivons maintenant à un point de débat intéressant. Quand devrions-nous utiliser une structure sur une classe et vice-versa?

Comme nous l'avons vu précédemment dans cet article, une instance d'une structure est créée dans la pile tandis qu'une instance d'une classe est créée dans le tas managé. L'allocation et la désallocation des types valeur sont moins chères que les types référence. Une structure est un bon choix lorsque vous devez créer un type de données composite qui contiendrait quelques membres de données. Idéalement, la taille des données membres d'une structure doit être inférieure à 16 octets. Vous pouvez opter pour une structure lorsque vous souhaitez créer une petite structure de données composite qui a une sémantique de valeur et ne contient que quelques membres de données. En utilisant struct dans de tels cas, vous pouvez éviter la surcharge associée au garbage collection.

Vous devez suivre les meilleures pratiques recommandées lorsque vous travaillez avec des structures. Vous devez éviter d'utiliser une structure d'une taille plus grande que ce qui est recommandé dans cet article. Notez également que le passage d'instances de structs aux méthodes est plus coûteux en termes de performances que le passage d'instances de classes. Il est conseillé d'utiliser des structures lorsque vous travaillez avec de petites structures de données. Vous pouvez en savoir plus sur ce sujet dans cet article MSDN.