Veuillez dire quelle est la différence entre is
et as
mot-clé en C#
Réponses
Trop de publicités?Opérateur IS
L'opérateur IS vérifie si le type d'un objet donné est compatible avec le nouveau type d'objet. Il renvoie une valeur de type booléen : vrai si l'objet donné est compatible avec le nouveau type, sinon faux. De cette façon, l'opérateur IS vous aide à faire un casting de type sûr.
Comment le faire..
Object obj = new Object(); // Creates a new Object obj
// checking compatibility of obj object with other type
Boolean b1 = (obj is Object); // b1 is set to true.
Boolean b2 = (obj is Employee); // The cast fails: no exception is thrown, but b2 is set to false.
//we can also use it
if (obj is Employee)
{
Employee emp = (Employee) obj;
// TO DO:
}
Note
Si la référence de l'objet donné est nulle, l'opérateur IS retournera false puisqu'il n'y a pas d'objet disponible pour vérifier son type. De cette façon, le CLR vérifie le type de l'objet obj deux fois. La première fois dans la condition if et si c'est vrai, dans le bloc if. En fait, cela affecte les performances car à chaque fois, CLR va parcourir la hiérarchie d'héritage, en vérifiant chaque type de base par rapport au type spécifié (Employee). Pour éviter cela, nous avons l'opérateur AS.
Opérateur AS
L'opérateur AS vérifie également si le type d'un objet donné est compatible avec le nouveau type d'objet. Il renvoie une valeur non nulle si l'objet donné est compatible avec le nouvel objet, sinon une valeur nulle. De cette façon, l'opérateur AS vous aide à faire un casting de type sûr. Le code ci-dessus peut être réécrit en utilisant l'opérateur AS d'une meilleure manière.
Comment le faire..
Object obj = new Object(); // Creates a new Object obj
// checking compatibility of obj object with other type
Employee emp = obj as Employee; // The cast fails: no exception is thrown, but emp is set to null.
if (emp != null)
{
// TO:DO
}
Note
Si la référence de l'objet donné est nulle, l'opérateur AS retournera NULL puisqu'il n'y a pas d'objet disponible pour vérifier son type. L'opérateur AS effectue uniquement des conversions de référence, des conversions de type nullable et des conversions de type boxing. Cet opérateur ne peut pas effectuer d'autres conversions comme les conversions définies par l'utilisateur.
L'opérateur Is, un cast, renvoie vrai s'il réussit. Il renvoie false si le cast échoue. Avec lui, vous ne pouvez pas capturer la variable convertie. L'opérateur is-cast n'est idéal que si la variable résultante ne sera pas utilisée par la suite.
Tout comme un casting. Avec lui, on gagne en performance et on évite les exceptions lorsqu'un cast est invalide. Null est retourné lorsque le cast est impossible. Pour les types de référence, le as-cast est recommandé. Elle est à la fois rapide et sûre. Nous pouvons tester la variable résultante par rapport à null, puis l'utiliser. Cela élimine les castings supplémentaires
- L'opérateur is vérifie si l'objet est compatible avec le type donné. type donné ; le résultat est basé sur vrai ou faux.
- comme est utilisé pour convertir un type en un autre type et lors de la conversion en cas d'échec, le résultat est nul, sauf si une exception est levée. voir le lien pour une meilleure compréhension avec des exemples https://blogs.msdn.microsoft.com/prakasht/2013/04/23/difference-between-direct-casting-is-and-as-operator-in-c/
7 votes
Est-ce que c'est comme ça ou est-ce que c'est comme ça ? blogs.msdn.com/b/ericlippert/archive/2010/09/16/
3 votes
Si ce sujet vous intéresse, vous voulez probablement aussi savoir quelle est la différence entre les opérateurs "as" et "cast" : blogs.msdn.com/b/ericlippert/archive/2009/10/08/
0 votes
@EricLippert Ce lien est maintenant rompu.
1 votes
@MaxBarraclough : Merci pour la note ; Microsoft a plusieurs fois maintenant déplacé les archives de mon blog sans faire de liens de redirection. J'ai fait une copie de l'article original dans le premier commentaire ici : ericlippert.com/2010/09/16/is-is-as-or-is-as-is . Je posterai un lien vers le second dans un commentaire ultérieur.
0 votes
@MaxBarraclough : Le lien mis à jour pour le second est : ericlippert.com/2009/10/08/ -- Merci encore.