C# Language comme


Exemple

Le mot clé as est un opérateur similaire à une distribution . Si un transtypage n'est pas possible, utilisez as produit null plutôt que de provoquer une InvalidCastException .

expression as type est équivalent à expression is type ? (type)expression : (type)null avec la mise en garde as est valable uniquement sur les conversions de référence, les conversions nullables et les conversions de boxe. Les conversions définies par l'utilisateur ne sont pas prises en charge. un casting régulier doit être utilisé à la place.

Pour l'expansion ci-dessus, le compilateur génère du code tel que l' expression ne sera évaluée qu'une seule fois et utilisera une vérification de type dynamique unique (contrairement aux deux dans l'exemple ci-dessus).

as peut être utile lorsque vous attendez un argument pour faciliter plusieurs types. Plus précisément, il accorde à l'utilisateur plusieurs options - plutôt que de vérifier chaque possibilité avec is avant de lancer, ou simplement de jeter et de rattraper les exceptions. Il est recommandé d'utiliser «as» lors de la conversion / vérification d'un objet, ce qui entraînera une seule pénalité de déballage. Utiliser is pour vérifier, alors le lancer entraînera deux pénalités de unboxing.

Si un argument est censé être une instance d'un type spécifique, une distribution régulière est préférable car son objectif est plus clair pour le lecteur.

Comme un appel à as peut produire une valeur null , vérifiez toujours le résultat pour éviter une NullReferenceException .

Exemple d'utilisation

object something = "Hello";
Console.WriteLine(something as string);        //Hello
Console.Writeline(something as Nullable<int>); //null
Console.WriteLine(something as int?);          //null

//This does NOT compile:
//destination type must be a reference type (or a nullable value type)
Console.WriteLine(something as int);

Démo en direct sur .NET Fiddle

Exemple équivalent sans utiliser as :

Console.WriteLine(something is string ? (string)something : (string)null);

Ceci est utile lors de la Equals fonction Equals dans les classes personnalisées.

class MyCustomClass
{

    public override bool Equals(object obj)
    {
        MyCustomClass customObject = obj as MyCustomClass;

        // if it is null it may be really null
        // or it may be of a different type
        if (Object.ReferenceEquals(null, customObject))
        {
            // If it is null then it is not equal to this instance.
            return false;
        }

        // Other equality controls specific to class
    }

}