Passer au contenu du pied de page
.NET AIDE

C# AS (Comment ça fonctionne pour les développeurs)

La programmation en C# implique souvent de travailler avec différents types de données. Parfois, nous devons vérifier si un object est d'un certain type ou tenter de le convertir en ce type. C'est là que le mot-clé opérateur as s'avère utile. Avec son proche parent, l'opérateur is facilite les tests de type et les conversions. Dans ce tutoriel, nous allons explorer les subtilités de cet opérateur et ses cas d'utilisation.

Compréhension de l'opérateur as

Principes de base de l'opérateur as

L'opérateur as en C# est un opérateur binaire permettant d'effectuer certaines conversions entre types référence compatibles ou types nullables. Le code suivant en fournit une démonstration simple :

// Declare an object that holds a string
object myObj = "Hello, World!";

// Use the 'as' operator to attempt to convert 'myObj' to a string
string myStr = myObj as string;

// myStr will hold the string value "Hello, World!" if the conversion is successful;
// otherwise, it will be null.
// Declare an object that holds a string
object myObj = "Hello, World!";

// Use the 'as' operator to attempt to convert 'myObj' to a string
string myStr = myObj as string;

// myStr will hold the string value "Hello, World!" if the conversion is successful;
// otherwise, it will be null.
' Declare an object that holds a string
Dim myObj As Object = "Hello, World!"

' Use the 'as' operator to attempt to convert 'myObj' to a string
Dim myStr As String = TryCast(myObj, String)

' myStr will hold the string value "Hello, World!" if the conversion is successful;
' otherwise, it will be null.
$vbLabelText   $csharpLabel

Dans le code ci-dessus, myObj est un objet de type object (le type de base pour tous les types en C#). Nous ne connaissons pas son type sous-jacent lors de la compilation. L'opérateur as est utilisé pour tenter de traiter myObj comme un string. En cas de succès, myStr contiendra la valeur de chaîne. Sinon, il contiendra une valeur null.

Quelle est la différence avec le Cast Explicite?

Bien que l'opérateur as et le cast explicite servent des objectifs similaires, il existe une distinction clé. Si une conversion explicite échoue, une exception est levée. En revanche, si la tentative de conversion d'un type à un autre par l'opérateur as échoue, l'opérateur renvoie une valeur null au lieu de lever une exception. Comprenons cela à l'aide de l'exemple de code suivant :

object someValue = 12345;
string castResult;

// Using explicit cast
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null; // The result is set to null if an exception is caught.
}

// Using the 'as' operator
string asResult = someValue as string; // No exception, but 'asResult' will be null since the cast fails.
object someValue = 12345;
string castResult;

// Using explicit cast
try {
    castResult = (string)someValue; // This will throw an exception since the cast fails.
}
catch(Exception ex) {
    castResult = null; // The result is set to null if an exception is caught.
}

// Using the 'as' operator
string asResult = someValue as string; // No exception, but 'asResult' will be null since the cast fails.
Dim someValue As Object = 12345
Dim castResult As String

' Using explicit cast
Try
	castResult = DirectCast(someValue, String) ' This will throw an exception since the cast fails.
Catch ex As Exception
	castResult = Nothing ' The result is set to null if an exception is caught.
End Try

' Using the 'as' operator
Dim asResult As String = TryCast(someValue, String) ' No exception, but 'asResult' will be null since the cast fails.
$vbLabelText   $csharpLabel

Comme vous pouvez le constater, l'utilisation de l'opérateur as peut souvent être plus sûre car elle permet d'éviter les erreurs d'exécution potentielles.

La connexion avec l'opérateur is

Souvent, l'opérateur as est utilisé en conjonction avec l'opérateur is pour tester le type avant de tenter une conversion. L'opérateur is vérifie si l'objet fourni est du type donné et renvoie true si c'est le cas, sinon, il renvoie false.

L'exemple de code suivant en est l'illustration :

object testObject = "This is a string";

// Check if testObject is of type string
if (testObject is string) {
    // If true, convert testObject to string using 'as'
    string result = testObject as string;
    Console.WriteLine(result); // Outputs: This is a string
} else {
    Console.WriteLine("Not a string");
}
object testObject = "This is a string";

// Check if testObject is of type string
if (testObject is string) {
    // If true, convert testObject to string using 'as'
    string result = testObject as string;
    Console.WriteLine(result); // Outputs: This is a string
} else {
    Console.WriteLine("Not a string");
}
Dim testObject As Object = "This is a string"

' Check if testObject is of type string
If TypeOf testObject Is String Then
	' If true, convert testObject to string using 'as'
	Dim result As String = TryCast(testObject, String)
	Console.WriteLine(result) ' Outputs: This is a string
Else
	Console.WriteLine("Not a string")
End If
$vbLabelText   $csharpLabel

Avec l'introduction de la correspondance de modèles dans les versions ultérieures de C#, l'opérateur is peut également effectuer certaines actions si le test de type réussit. Cela réduit souvent le besoin d'utiliser l'opérateur as.

Approfondissement : cas particuliers et considérations

Conversions de types de valeurs nullables

L'un des cas particuliers où l'opérateur as s'avère indispensable concerne les types valeur nullables. Les types valeur (comme int, double, etc.) ne peuvent pas se voir attribuer une valeur null. Toutefois, en les rendant nullables, vous pouvez leur attribuer null. L'opérateur as peut être utilisé pour tenter une conversion vers un type de valeur nullable :

// Declare a nullable integer
int? nullableInt = 10;

// Box the nullable int
object objInt = nullableInt;

// Attempt to unbox using 'as' to a nullable int type
int? resultInt = objInt as int?;
// Declare a nullable integer
int? nullableInt = 10;

// Box the nullable int
object objInt = nullableInt;

// Attempt to unbox using 'as' to a nullable int type
int? resultInt = objInt as int?;
' Declare a nullable integer
Dim nullableInt? As Integer = 10

' Box the nullable int
Dim objInt As Object = nullableInt

' Attempt to unbox using 'as' to a nullable int type
Dim resultInt? As Integer = CType(objInt, Integer?)
$vbLabelText   $csharpLabel

Conversions de référence et conversions définies par l'utilisateur

L'opérateur as prend en charge à la fois les conversions de référence (entre types de référence apparentés) et les conversions définies par l'utilisateur. Les conversions définies par l'utilisateur sont celles qui sont définies à l'aide de méthodes de conversion spéciales dans vos classes.

Considérons le code suivant d'une conversion définie par l'utilisateur :

class Sample {
    // Define an implicit conversion from Sample to string
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();

// Use 'as' to convert 'sampleObject' to string
string conversionResult = sampleObject as string;

// conversionResult will hold "Converted to String"
class Sample {
    // Define an implicit conversion from Sample to string
    public static implicit operator string(Sample s) {
        return "Converted to String";
    }
}

Sample sampleObject = new Sample();

// Use 'as' to convert 'sampleObject' to string
string conversionResult = sampleObject as string;

// conversionResult will hold "Converted to String"
Friend Class Sample
	' Define an implicit conversion from Sample to string
	Public Shared Widening Operator CType(ByVal s As Sample) As String
		Return "Converted to String"
	End Operator
End Class

Private sampleObject As New Sample()

' Use 'as' to convert 'sampleObject' to string
Private conversionResult As String = TryCast(sampleObject, String)

' conversionResult will hold "Converted to String"
$vbLabelText   $csharpLabel

Ici, la méthode de conversion définie par l'utilisateur permet à un objet de type Sample d'être traité comme un string.

Quand as ne s'applique pas

N'oubliez pas que l'opérateur as ne peut pas être utilisé avec des types de valeurs (sauf s'il s'agit de types de valeurs nullables) ou avec des conversions définies par l'utilisateur qui impliquent une méthode explicite.

Scénarios avancés avec l'opérateur as

Boxing et Unboxing avec as

La mise en boîte est le processus de conversion d'une instance de type valeur en une référence d'objet. Ceci est rendu possible car chaque type de valeur hérite implicitement d'un object. Lorsque vous encadrez un type valeur, vous l'enveloppez dans un object.

Considérez le code suivant pour les conversions de mise en boîte :

int intValue = 42;

// Box the value type to an object
object boxedValue = intValue;
int intValue = 42;

// Box the value type to an object
object boxedValue = intValue;
Dim intValue As Integer = 42

' Box the value type to an object
Dim boxedValue As Object = intValue
$vbLabelText   $csharpLabel

Ici, le intValue est encadré dans un object.

Le déballage est le processus inverse de l'emballage, c'est-à-dire l'extraction du type de valeur à partir du object. L'opérateur as peut être utilisé pour déballer en toute sécurité des valeurs, en particulier lorsque vous n'êtes pas sûr que object contienne le type de valeur que vous attendez. Si l'unboxing échoue, le résultat de l'expression sera null.

Prenons l'exemple suivant pour les conversions d'unboxing :

object obj = 42;

// Attempt to unbox using 'as' to a nullable int type
int? result = obj as int?;
object obj = 42;

// Attempt to unbox using 'as' to a nullable int type
int? result = obj as int?;
Dim obj As Object = 42

' Attempt to unbox using 'as' to a nullable int type
Dim result? As Integer = CType(obj, Integer?)
$vbLabelText   $csharpLabel

Travailler avec des tableaux

Les tableaux sont des types de référence en C#. Parfois, vous devrez déterminer si un object est un type de tableau spécifique et ensuite travailler avec celui-ci. L'opérateur as peut également être utile ici.

Considérons le code suivant :

object[] arrayObject = new string[] { "one", "two", "three" };

// Attempt to cast to a string array using 'as'
string[] stringArray = arrayObject as string[];

// stringArray will hold the array of strings if successful
object[] arrayObject = new string[] { "one", "two", "three" };

// Attempt to cast to a string array using 'as'
string[] stringArray = arrayObject as string[];

// stringArray will hold the array of strings if successful
Dim arrayObject() As Object = New String() { "one", "two", "three" }

' Attempt to cast to a string array using 'as'
Dim stringArray() As String = TryCast(arrayObject, String())

' stringArray will hold the array of strings if successful
$vbLabelText   $csharpLabel

Dans le code ci-dessus, arrayObject est un tableau d'objets mais contient en réalité des chaînes de caractères. En utilisant l'opérateur as, vous pouvez tenter en toute sécurité de le traiter comme un tableau de chaînes de caractères.

Combinaison de as avec LINQ

Language Integrated Query (LINQ - Microsoft Documentation) est une fonctionnalité puissante de C# qui permet d'interroger des collections à la manière de SQL. Il arrive parfois que l'on récupère des objets de types mixtes dans une collection et que l'on souhaite filtrer certains types. Dans ce cas, l'opérateur as peut s'avérer très pratique.

Prenons l'exemple d'une liste d'objets contenant à la fois des chaînes de caractères et des nombres entiers. Si vous souhaitez récupérer uniquement les chaînes de caractères, vous pouvez utiliser l'opérateur as en conjonction avec LINQ :

var mixedList = new List<object> { "Hello", 42, "World", 100 };

// Use LINQ to select only strings from mixedList
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();

// stringValues will contain "Hello" and "World"
var mixedList = new List<object> { "Hello", 42, "World", 100 };

// Use LINQ to select only strings from mixedList
var stringValues = mixedList
    .Select(item => item as string)
    .Where(item => item != null)
    .ToList();

// stringValues will contain "Hello" and "World"
Dim mixedList = New List(Of Object) From {"Hello", 42, "World", 100}

' Use LINQ to select only strings from mixedList
Dim stringValues = mixedList.Select(Function(item) TryCast(item, String)).Where(Function(item) item IsNot Nothing).ToList()

' stringValues will contain "Hello" and "World"
$vbLabelText   $csharpLabel

Intégration avec Iron Suite

Les solutions Iron Suite pour les développeurs C# sont une suite d'outils de haute qualité qui permettent aux développeurs C# d'intégrer de manière transparente des fonctionnalités telles que la manipulation de PDF, le traitement d'Excel, la reconnaissance optique de caractères (OCR), ainsi que la génération et la lecture de codes-barres. Ces outils, comme notre discussion précédente sur les opérateurs as et is, sont essentiels pour amplifier l'efficacité d'un développeur dans la création d'applications robustes.

IronPDF

C# AS (Fonctionnement pour les développeurs) Figure 1 - IronPDF for .NET: La bibliothèque PDF C#

IronPDF permet aux développeurs de générer, manipuler et lire des fichiers PDF au sein de leurs applications C#. En ce qui concerne la pertinence de notre sujet, supposons que vous disposiez d'un type de référence contenant des données et que vous souhaitiez convertir ces données en un rapport ou un document. IronPDF peut prendre la sortie de votre application et, d'une manière similaire à la conversion de type, la traduire en un document PDF bien formaté.

IronXL

C# AS (Fonctionnement pour les développeurs) Figure 2 - IronXL for .NET: La bibliothèque Excel C#

La manipulation de fichiers Excel est une exigence fréquente dans de nombreuses applications logicielles. IronXL for Excel Operations permet aux développeurs de lire, modifier et créer des feuilles de calcul Excel sans avoir recours à Office Interop. Dans le cadre de notre discussion sur les conversions de types, considérez IronXL comme un outil permettant de convertir facilement des structures de données ou des entrées de base de données C# en formats Excel.

IronOCR

C# AS (Fonctionnement pour les développeurs) Figure 3 - IronOCR for .NET: La bibliothèque OCR C#

Optical Character Recognition with IronOCR est un outil de reconnaissance optique de caractères qui permet aux développeurs de lire et d'interpréter du texte à partir d'images. Pour faire le lien avec notre tutoriel, c'est similaire à la conversion d'un object (dans ce cas, une image) en un type plus spécifique (string ou données textuelles) à l'aide de capacités de reconnaissance avancées.

IronBarcode

C# AS (Fonctionnement pour les développeurs) Figure 4 - IronBarcode for .NET: La bibliothèque de codes-barres C#

Dans de nombreuses applications commerciales, la manipulation des BarCodes est indispensable. IronBarcode Tool for Barcode Processing aide les développeurs à générer, lire et décoder des codes-barres dans les applications C#. En lien avec notre discussion sur les conversions de type, IronBarcode peut être considéré comme un outil qui traduit les données visuelles de code-barres (une forme de object) en types de données plus spécifiques et utilisables, tels que des chaînes de caractères ou des détails de produit.

Conclusion

C# AS (Fonctionnement pour les développeurs) Figure 5 - Iron Suite for .NET

Chaque produit de l'Iron Suite témoigne de la flexibilité et de la puissance qu'offre le langage C#, en particulier lorsqu'il est lié à notre discussion sur les conversions de type et la vérification de type. Ces outils, comme les opérateurs as et is, offrent aux développeurs la possibilité de convertir et de traiter efficacement les données.

Si vous envisagez d'intégrer l'un de ces outils dans vos projets, il convient de noter que chaque licence de produit commence à $999 et que chaque produit offre un essai gratuit d’Iron Suite. Pour ceux qui recherchent une solution complète, Iron Suite propose une offre avantageuse : vous pouvez acquérir la licence Iron Suite pour le prix de seulement deux produits.

Questions Fréquemment Posées

Quel est le rôle de l'opérateur 'as' dans le développement C# ?

L'opérateur 'as' en C# est utilisé pour effectuer des conversions de type sûres entre des types de référence compatibles ou des types annulables, renvoyant null si la conversion échoue, évitant ainsi les exceptions.

Comment pouvez-vous gérer les conversions de type en toute sécurité en C# ?

Vous pouvez utiliser l'opérateur 'as' pour des conversions de type sûres, car il renvoie null au lieu de lancer une exception lorsque la conversion échoue, ce qui le rend plus sûr que le casting explicite.

Pourquoi l'opérateur 'as' est-il préféré au casting explicite dans certains scénarios ?

L'opérateur 'as' est préféré lorsque vous voulez éviter les exceptions causées par des conversions échouées, puisqu'il renvoie null au lieu de lancer une exception, contrairement au casting explicite.

Comment l'opérateur 'as' fonctionne-t-il avec les types annulables en C# ?

L'opérateur 'as' peut être utilisé avec des types annulables, permettant une conversion sûre qui renvoie null si l'objet ne peut pas être converti en le type annulable spécifié.

Comment IronPDF peut-il être utilisé en C# pour la conversion de documents ?

IronPDF permet aux développeurs C# de convertir du HTML en PDF, de manipuler le contenu des PDF, et de générer des fichiers PDF de manière programmatique, améliorant ainsi les capacités de gestion des documents dans les applications.

Quels sont les avantages d'utiliser Iron Suite pour les développeurs C# ?

Iron Suite offre des outils tels que IronPDF, IronXL, IronOCR et IronBarcode, permettant aux développeurs de gérer efficacement la conversion et la manipulation de données à travers divers formats.

Comment pouvez-vous filtrer des types spécifiques d'une collection en utilisant C# ?

Vous pouvez utiliser l'opérateur 'as' en conjonction avec les requêtes LINQ pour filtrer des types spécifiques d'une collection, en s'assurant que seul le type désiré est sélectionné à partir de listes d'objets mixtes.

Quel est un cas d'utilisation courant pour combiner les opérateurs 'is' et 'as' en C# ?

Combiner les opérateurs 'is' et 'as' vous permet de d'abord vérifier le type d'un objet avec 'is' avant de le convertir en toute sécurité avec 'as', assurant la sécurité des types et évitant les exceptions.

Jacob Mellor, Directeur technique @ Team Iron
Directeur technique

Jacob Mellor est directeur de la technologie chez Iron Software et un ingénieur visionnaire pionnier de la technologie C# PDF. En tant que développeur à l'origine de la base de code centrale d'Iron Software, il a façonné l'architecture des produits de l'entreprise depuis sa création, ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi