AIDE .NET

C# Struct vs Class (Comment ça marche pour les développeurs)

Publié mars 6, 2024
Partager:

En C#, les structures et les classes sont des éléments fondamentaux pour l'organisation et le stockage des données, mais elles présentent des caractéristiques distinctes qui les rendent adaptées à des scénarios différents. Comprendre les différences entre Structures et classes C# est essentiel pour prendre des décisions éclairées lors de la conception de vos applications C#.

Dans cet article, nous allons explorer les principales distinctions entre les structures et les classes, en discutant de leurs cas d'utilisation, de la gestion de la mémoire et des implications en termes de performances. Nous verrons également comment utiliser les structs et les classes avec IronPDF pour la création de fichiers PDF.

1. Aperçu des structures et des classes

1.1. Classes (types de référence)

Types de référence: Une classe en C# est un type de référence résidant sur le tas, ce qui signifie que lorsqu'une instance d'une classe est créée, une référence à l'objet est stockée en mémoire.

Allocation du tas: Les instances de classe se voient allouer de la mémoire sur le tas, ce qui offre une certaine souplesse en termes de taille et permet de partager des objets entre différentes parties du code.

Constructeur par défaut: Les classes peuvent avoir un constructeur par défaut, qui est automatiquement fourni si aucun n'est explicitement défini.

**Les classes supportent l'héritage, ce qui permet de créer des classes dérivées ayant des caractéristiques communes.

using System;
// Define a class
public class MyClass
{
    // Fields (data members)
    public int MyField;
    // Constructor
    public MyClass(int value)
    {
        MyField = value;
    }
    // Method
    public void Display()
    {
        Console.WriteLine($"Value in MyClass: {MyField}");
    }
}
class Program
{
    static void Main()
    {
        // Create an instance of the class
        MyClass myClassInstance = new MyClass(10);
        // Access field and call method
        myClassInstance.Display();
        // Classes are reference types, so myClassInstance refers to the same object in memory
        MyClass anotherInstance = myClassInstance;
        anotherInstance.MyField = 20;
        // Both instances refer to the same object, so the change is reflected in both
        myClassInstance.Display();
        anotherInstance.Display();
    }
}
using System;
// Define a class
public class MyClass
{
    // Fields (data members)
    public int MyField;
    // Constructor
    public MyClass(int value)
    {
        MyField = value;
    }
    // Method
    public void Display()
    {
        Console.WriteLine($"Value in MyClass: {MyField}");
    }
}
class Program
{
    static void Main()
    {
        // Create an instance of the class
        MyClass myClassInstance = new MyClass(10);
        // Access field and call method
        myClassInstance.Display();
        // Classes are reference types, so myClassInstance refers to the same object in memory
        MyClass anotherInstance = myClassInstance;
        anotherInstance.MyField = 20;
        // Both instances refer to the same object, so the change is reflected in both
        myClassInstance.Display();
        anotherInstance.Display();
    }
}
Imports System
' Define a class
Public Class [MyClass]
	' Fields (data members)
	Public MyField As Integer
	' Constructor
	Public Sub New(ByVal value As Integer)
		MyField = value
	End Sub
	' Method
	Public Sub Display()
		Console.WriteLine($"Value in MyClass: {MyField}")
	End Sub
End Class
Friend Class Program
	Shared Sub Main()
		' Create an instance of the class
		Dim myClassInstance As [MyClass] = New [MyClass](10)
		' Access field and call method
		myClassInstance.Display()
		' Classes are reference types, so myClassInstance refers to the same object in memory
		Dim anotherInstance As [MyClass] = myClassInstance
		anotherInstance.MyField = 20
		' Both instances refer to the same object, so the change is reflected in both
		myClassInstance.Display()
		anotherInstance.Display()
	End Sub
End Class
VB   C#

Structures et classes en C# (Comment ça marche pour les développeurs) : Figure 1 - Sortie dans la console du code précédent

1.2. Structures (types de valeurs)

Types de valeur: Les structures sont des types de valeur, ce qui signifie que les données réelles sont stockées à l'endroit où la variable est déclarée, plutôt que dans un emplacement distinct en mémoire comme les types primitifs. Cela signifie également qu'il n'est pas possible d'attribuer une valeur nulle à la structure en tant que type de valeur sans en faire un type nullable à l'aide de la balise Nullable<>.

Allocation de la pile: Les instances de structures se voient allouer de la mémoire sur la pile, ce qui permet d'accélérer l'allocation et la désallocation, mais limite la taille et la portée de l'instance.

Pas de constructeur par défaut: Les structures n'ont pas de constructeur par défaut à moins qu'un constructeur ne soit explicitement défini. Chaque champ doit être initialisé lors de l'instanciation.

Pas d'héritage: Les structures ne prennent pas en charge l'héritage. Ils sont principalement utilisés pour les structures de données légères.

using System;
// Define a struct
public struct MyStruct
{
    // Fields (data members)
    public int MyField;
    // Constructor
    public MyStruct(int value)
    {
        MyField = value;
    }
    // Method
    public void Display()
    {
        Console.WriteLine($"Value in MyStruct: {MyField}");
    }
}
class Program
{
    static void Main()
    {
        // Create an instance of the struct
        MyStruct myStructInstance = new MyStruct(10);
        // Access field and call method
        myStructInstance.Display();
        // Structs are value types, so myStructInstance is a copy
        MyStruct anotherInstance = myStructInstance;
        anotherInstance.MyField = 20;
        // Changes to anotherInstance do not affect myStructInstance
        myStructInstance.Display();
        anotherInstance.Display();
    }
}
using System;
// Define a struct
public struct MyStruct
{
    // Fields (data members)
    public int MyField;
    // Constructor
    public MyStruct(int value)
    {
        MyField = value;
    }
    // Method
    public void Display()
    {
        Console.WriteLine($"Value in MyStruct: {MyField}");
    }
}
class Program
{
    static void Main()
    {
        // Create an instance of the struct
        MyStruct myStructInstance = new MyStruct(10);
        // Access field and call method
        myStructInstance.Display();
        // Structs are value types, so myStructInstance is a copy
        MyStruct anotherInstance = myStructInstance;
        anotherInstance.MyField = 20;
        // Changes to anotherInstance do not affect myStructInstance
        myStructInstance.Display();
        anotherInstance.Display();
    }
}
Imports System
' Define a struct
Public Structure MyStruct
	' Fields (data members)
	Public MyField As Integer
	' Constructor
	Public Sub New(ByVal value As Integer)
		MyField = value
	End Sub
	' Method
	Public Sub Display()
		Console.WriteLine($"Value in MyStruct: {MyField}")
	End Sub
End Structure
Friend Class Program
	Shared Sub Main()
		' Create an instance of the struct
		Dim myStructInstance As New MyStruct(10)
		' Access field and call method
		myStructInstance.Display()
		' Structs are value types, so myStructInstance is a copy
		Dim anotherInstance As MyStruct = myStructInstance
		anotherInstance.MyField = 20
		' Changes to anotherInstance do not affect myStructInstance
		myStructInstance.Display()
		anotherInstance.Display()
	End Sub
End Class
VB   C#

Structures et classes en C# (Comment ça marche pour les développeurs) : Figure 2 - Sortie dans la console du code précédent

2. Cas d'utilisation et lignes directrices

2.1. Quand utiliser les classes

État et comportement complexes: Utilisez des classes lorsque vous devez modéliser des structures de données complexes avec un état et un comportement. Les classes permettent de représenter des objets complexes dotés de propriétés et de méthodes multiples.

Sémantique de référence: Si vous souhaitez partager des instances d'objets et faire en sorte que les modifications soient répercutées dans différentes parties de votre code, les classes sont le choix approprié.

2.2. Quand utiliser les structures

Structures de données simples: Les structures sont idéales pour les structures de données plus simples qui représentent des entités légères comme les petites structures de données, telles que les points, les rectangles, les paires clé-valeur, ou si la structure représente logiquement une seule valeur, comme les types primitifs.

Sémantique des valeurs: Lorsque vous préférez la sémantique des valeurs et que vous voulez éviter l'allocation du tas, les structures sont une bonne solution.

Considérations sur les performances: Dans les scénarios où les performances sont critiques, en particulier pour les petits objets fréquemment utilisés, les structures peuvent être plus efficaces en raison de l'allocation de la pile.

3. Différences d'allocation de mémoire

3.1. Les classes

**La mémoire des instances de classe est gérée par le biais d'un comptage de références par le ramasse-miettes. Les objets sont éligibles au ramassage des ordures lorsqu'il n'y a plus de références à leur sujet.

Potentiel de fuites de mémoire: Une mauvaise gestion des références peut entraîner des fuites de mémoire si les objets ne sont pas éliminés correctement lorsqu'ils ne sont plus nécessaires.

3.2. Structures

Pas de ramassage des ordures: Les structures ne dépendent pas du ramassage des ordures puisqu'elles sont des types de valeurs et sont gérées différemment. Ils sont automatiquement désalloués lorsqu'ils sortent du champ d'application.

**Les structs ont un encombrement mémoire plus faible que les classes, ce qui les rend efficaces dans les scénarios où l'utilisation de la mémoire est un problème.

4. Considérations sur les performances

Classes

Accès indirect: Étant donné que les instances de classe sont accessibles par le biais de références, il existe un niveau d'indirection supplémentaire, qui peut entraîner un léger surcoût en termes de performances.

**L'allocation dynamique de la mémoire sur le tas peut entraîner des temps de création et de destruction d'objets plus longs.

Structures

Accès direct: Les structures sont accessibles directement, ce qui élimine le besoin d'un niveau d'indirection supplémentaire. Cela peut se traduire par de meilleures performances pour les petits objets fréquemment utilisés.

Allocation de la pile: L'allocation de la mémoire à la pile permet de créer et de détruire plus rapidement des instances de structures.

5. Présentation d'IronPDF

IronPDF est une bibliothèque C# robuste conçue pour la génération, la manipulation et le rendu de fichiers PDF au sein d'applications .NET. Avec IronPDF, les développeurs peuvent créer, modifier et interagir avec les documents PDF sans effort, ce qui en fait un outil essentiel pour des tâches allant de la génération dynamique de PDF à partir d'un contenu HTML à l'extraction de données à partir de documents existants. Cette bibliothèque polyvalente simplifie les fonctionnalités liées au format PDF et offre un ensemble complet de fonctions aux développeurs travaillant sur des applications web, des logiciels de bureau ou tout autre projet .NET nécessitant une gestion efficace du format PDF.

5.1. Installation d'IronPDF

Avant de plonger dans les exemples de code, vous devez installer IronPDF. Vous pouvez le faire en utilisant la console du gestionnaire de paquets NuGet ou en ajoutant une référence à la bibliothèque IronPDF dans votre projet. Les étapes suivantes décrivent le processus d'installation :

  1. NuGet Package Manager Console:
    :ProductInstall
  1. UI du gestionnaire de paquets: Recherchez "IronPDF" dans l'interface du gestionnaire de paquets NuGet et installez la dernière version.

    Une fois IronPDF installé, vous êtes prêt à exploiter ses capacités de traitement des fichiers PDF dans vos applications C#.

5.2. Utilisation de Struct et Class avec IronPDF

using IronPdf;
using System;
// Sample class
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
// Sample struct
struct Point
{
    public int X { get; set; }
    public int Y { get; set; }
}
class Program
{
    static void Main()
    {
        // Sample instances of class and struct
        Person person = new Person { Name = "John Doe", Age = 30 };
        Point point = new Point { X = 10, Y = 20 };
        // Create a new PDF document
        var renderer = new ChromePdfRenderer();
        // Add content with information from class and struct
        string content = $@"<!DOCTYPE html>
                            <html>
                            <body>
                                <h1>Information in IronPDF</h1>
                                <p>Name: {person.Name}</p>
                                <p>Age: {person.Age}</p>
                                <p>Point X: {point.X}</p>
                                <p>Point Y: {point.Y}</p>
                            </body>
                            </html>";
        // Render HTML content to PDF
        var pdf = renderer.RenderHtmlAsPdf(content);
        // Save the PDF to a file
        pdf.SaveAs("InformationDocument.pdf");
    }
}
using IronPdf;
using System;
// Sample class
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
// Sample struct
struct Point
{
    public int X { get; set; }
    public int Y { get; set; }
}
class Program
{
    static void Main()
    {
        // Sample instances of class and struct
        Person person = new Person { Name = "John Doe", Age = 30 };
        Point point = new Point { X = 10, Y = 20 };
        // Create a new PDF document
        var renderer = new ChromePdfRenderer();
        // Add content with information from class and struct
        string content = $@"<!DOCTYPE html>
                            <html>
                            <body>
                                <h1>Information in IronPDF</h1>
                                <p>Name: {person.Name}</p>
                                <p>Age: {person.Age}</p>
                                <p>Point X: {point.X}</p>
                                <p>Point Y: {point.Y}</p>
                            </body>
                            </html>";
        // Render HTML content to PDF
        var pdf = renderer.RenderHtmlAsPdf(content);
        // Save the PDF to a file
        pdf.SaveAs("InformationDocument.pdf");
    }
}
Imports IronPdf
Imports System
' Sample class
Friend Class Person
	Public Property Name() As String
	Public Property Age() As Integer
End Class
' Sample struct
Friend Structure Point
	Public Property X() As Integer
	Public Property Y() As Integer
End Structure
Friend Class Program
	Shared Sub Main()
		' Sample instances of class and struct
		Dim person As New Person With {
			.Name = "John Doe",
			.Age = 30
		}
		Dim point As New Point With {
			.X = 10,
			.Y = 20
		}
		' Create a new PDF document
		Dim renderer = New ChromePdfRenderer()
		' Add content with information from class and struct
		Dim content As String = $"<!DOCTYPE html>
                            <html>
                            <body>
                                <h1>Information in IronPDF</h1>
                                <p>Name: {person.Name}</p>
                                <p>Age: {person.Age}</p>
                                <p>Point X: {point.X}</p>
                                <p>Point Y: {point.Y}</p>
                            </body>
                            </html>"
		' Render HTML content to PDF
		Dim pdf = renderer.RenderHtmlAsPdf(content)
		' Save the PDF to a file
		pdf.SaveAs("InformationDocument.pdf")
	End Sub
End Class
VB   C#
  • Person est une classe d'exemple représentant une personne avec les propriétés Name et Age.
  • Point est un exemple de structure représentant un point dans un système de coordonnées 2D avec des propriétés X et Y.
  • Des instances de la classe Personne et de la structure Point sont créées.
  • Le contenu HTML est ensuite rendu dans le document PDF, qui est enregistré sous le nom de "InformationDocument.pdf"

5.2.1. Fichier PDF de sortie

Structures et classes en C# (Comment ça marche pour les développeurs) : Figure 3 - Le fichier PDF produit à partir du code précédent

6. Conclusion

En conclusion, le choix entre l'utilisation des structs et des classes C# dépend des exigences et des caractéristiques spécifiques de votre application. Les classes, en tant que types de référence, sont adaptées à la modélisation d'entités complexes dotées d'un état et d'un comportement, à la prise en charge de l'héritage et à la facilitation des instances partagées. D'autre part, les structures, en tant que types de valeur, sont idéales pour les structures de données légères avec une sémantique de valeur, offrant des avantages de performance en termes d'allocation de pile et d'accès direct.

IronPDF offre un service de licence d'essai gratuite pour les utilisateurs, ce qui est une bonne occasion de se familiariser avec les caractéristiques et les fonctionnalités d'IronPDF. Pour en savoir plus sur IronPDF, visitez le site suivant link et un tutoriel détaillé sur la création de fichiers PDF à l'aide d'IronPDF est disponible à l'adresse suivante link.

< PRÉCÉDENT
C# Initialize Array (Comment ça marche pour les développeurs)
SUIVANT >
NPlot C# (Comment ça marche pour les développeurs)