AIDE .NET

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

Chaknith Bin
Chaknith Bin
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 les structs et les classes en C# est crucial 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 discuterons également de l'utilisation des structures et des classes avec IronPDF for C# 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 dans 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 sur le tas : Les instances de classe sont allouées en mémoire sur le tas, offrant une flexibilité de taille et permettant aux objets d'être partagés entre différentes parties du code.

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

Héritage : Les classes prennent en charge l'héritage, permettant la création de classes dérivées avec 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
$vbLabelText   $csharpLabel

C# Struct vs Class (Comment cela fonctionne pour les développeurs) : Figure 1 - Sortie dans la console à partir du code précédent

1.2. Structures (types de valeurs)

Types de Valeur : Les structures (structs) 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 séparé en mémoire comme les types primitifs. Cela signifie également qu'une structure ne peut pas être assignée à une valeur null en tant que type de valeur sans en faire un type nullable avec le tag Nullable<>.

Allocation sur la pile : Les instances de struct sont allouées en mémoire sur la pile, ce qui permet une allocation et une désallocation plus rapides mais avec des limitations de taille et de portée.

Pas de constructeur par défaut : Les structures n'ont pas de constructeur par défaut sauf si un est 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
$vbLabelText   $csharpLabel

Struct vs Class en C# (Comment cela fonctionne 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 avez besoin de modéliser des structures de données complexes avec état et 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 que les modifications soient reflété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 des structures de données plus simples qui représentent des entités légères comme des petites structures de données, telles que des points, des rectangles, des paires clé-valeur, ou si la structure représente logiquement une valeur unique, similaire aux types primitifs.

Sémantique de valeur : Lorsque vous préférez la sémantique de valeur et souhaitez éviter la surcharge de l'allocation sur le tas, les structures (structs) sont un bon choix.

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

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

3.1. Les classes

Comptage de références : La mémoire pour les instances de classe est gérée par le 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 gestion inadéquate des références peut entraîner des fuites de mémoire si les objets ne sont pas correctement libérés lorsqu'ils ne sont plus nécessaires.

3.2. Structures

Pas de collecte de déchets : Les structures n’utilisent pas la collecte de déchets, car elles sont des types de valeur et sont gérées différemment. Ils sont automatiquement désalloués lorsqu'ils sortent du champ d'application.

Surcharge mémoire limitée : Les structures ont une surcharge mémoire inférieure par rapport aux classes, ce qui les rend efficaces dans les scénarios où l'utilisation de la mémoire est préoccupante.

4. Considérations sur les performances

Classes

Accès indirect : Comme les instances de classe sont accessibles par le biais de références, il y a un niveau supplémentaire d'indirection, ce qui peut introduire une légère surcharge de performance.

Allocation sur le tas : L'allocation dynamique de 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 structs sont accédés directement, éliminant le besoin d'un niveau supplémentaire d'indirection. Cela peut se traduire par de meilleures performances pour les petits objets fréquemment utilisés.

Allocation de pile : L'allocation de mémoire sur la pile permet une création et une destruction plus rapides des instances de structure.

5. Présentation d'IronPDF

Présentation d'IronPDF : bibliothèque C# robuste pour la manipulation de PDF est conçue pour une génération, une manipulation, et un rendu PDF sans faille au sein des 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. Console du gestionnaire de packages NuGet :
    :ProductInstall
  1. Interface utilisateur du gestionnaire de packages : Recherchez "IronPDF" dans l'interface utilisateur du gestionnaire de packages 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
$vbLabelText   $csharpLabel
  • Person est une classe d'exemple représentant une personne avec les propriétés Name et Age.
  • Point est une structure d'exemple représentant un point dans un système de coordonnées 2D avec les propriétés X et Y.
  • Des instances de la classe Person 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

Structure C# vs Classe (Comment cela fonctionne pour les développeurs) : Figure 3 - Le fichier PDF généré à 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 propose une Licence d'essai gratuite pour évaluation aux utilisateurs, ce qui est une bonne occasion de découvrir les fonctionnalités et les caractéristiques d'IronPDF. Pour en savoir plus sur IronPDF, consultez la Documentation complète d'IronPDF, et un didacticiel détaillé pour créer des fichiers PDF avec IronPDF est disponible sur le Didacticiel de génération de PDF avec IronPDF.

Chaknith Bin
Ingénieur logiciel
Chaknith travaille sur IronXL et IronBarcode. Il possède une expertise approfondie en C# et .NET, aidant à améliorer le logiciel et à soutenir les clients. Ses idées issues des interactions avec les utilisateurs contribuent à de meilleurs produits, une documentation améliorée et une expérience globale enrichie.
< PRÉCÉDENT
C# Initialize Array (Comment ça marche pour les développeurs)
SUIVANT >
NPlot C# (Comment ça marche pour les développeurs)