Quand devez-vous utiliser comme mot-clé en C#
Lorsque vous souhaitez changer de type, la plupart du temps vous voulez juste utiliser la coulée traditionnelle.
var value = (string)dictionary[key];
C'est bon parce que:
- C'est rapide
- Il va se plaindre si quelque chose est mal (au lieu de donner un objet est null exceptions)
Alors, quel est un bon exemple de l'utilisation de as
je ne pouvais pas vraiment trouver ou de penser à quelque chose qui lui convient parfaitement?
Remarque: en Fait, je pense que parfois il y a des cas où le compilateur empêche l'utilisation d'un casting où as
œuvres (les génériques sont-ils liés?).
Le compilateur n'a pas vraiment de "prévenir" un casting, elle donne juste une erreur lorsqu'il peut déterminer statiquement que les types sont indépendants, et donc le casting serait toujours voués à l'échec.
OriginalL'auteur Daniel Little | 2011-09-27
Vous devez vous connecter pour publier un commentaire.
Utilisation
as
quand il est valide pour un objet de ne pas être du type que vous voulez, et vous voulez agir différemment si elle est. Par exemple, dans un pseudo-code:Ou d'optimisation dans LINQ to Objects (beaucoup d'exemples de ce genre):
Donc à l'aide d'
as
est comme unis
+ un casting. C'est presque toujours utilisé avec une nullité vérifiez par la suite, selon les exemples ci-dessus.Avez-vous un exemple pour le "presque toujours" peu?
J'ai parfois utilisé
as
avec un appel de méthode, où le paramètre peut être nulle, j'ai donc été en mesure de transmettre de manière inconditionnelle. Il y a sans doute une valeur null vérifier à l'intérieur de la méthode bien 🙂 Une variante est de l'utiliser avec le nul de la coalescence de l'opérateur, par exempleIList<T> list = sequence as IList<T> ?? sequence.ToList();
OriginalL'auteur Jon Skeet
Chaque fois quand vous en avez besoin pour la sécurité de cast de l'objet, sans exception, l'utilisation
:
Yep, et j'ai répondu: quand vous en avez besoin pour la sécurité de cast de l'objet, sans exception,
et de mon point est que vous ne répondez pas à la question "Quand avez-vous , d'un coffre-fort fonte". (d'un coffre-fort cast jamais jette en premier lieu). Donc, une réponse devrait inclure un scénario où il est valide pour que l'objet soit d'un type différent, mais où vous pourriez obtenir quelque chose si vous étiez en mesure d'utiliser les connaissances de l'environnement d'exécution de type. Voir Jons réponse pour un exemple
Acceptez que l'échantillon de l'utilisation sera plus utile ici. Vous pouvez downvote.
Je ne ressens pas un besoin de downvote. Vous êtes à la réponse n'est pas incorrect. J'ai été tout simplement ce qui suggère un moyen de faire encore mieux (à mon humble avis)
OriginalL'auteur Samich
Est utilisé pour éviter la coulée double logique comme dans:
À l'aide de
Pour info, IL a généré pour le cas n ° 1:
et pour le cas n ° 2:
OriginalL'auteur vc 74
À l'aide de
as
ne sera pas jeter un casting d'exception, mais il suffit de le retournernull
si la conversion échoue.OriginalL'auteur Ross
La mise en œuvre de l' .Count() dans l'Énumération qu'il utilise pour faire Count() pour la collecte plus rapide
La mise en œuvre est comme:
Qui essaie de jeter la source, soit ICollection ou ICollection les deux ont une propriété Count.
Si cela échoue Count() parcourt l'ensemble de la source.
Donc, si vous avez un doute sur le type et le besoin de l'objet du type de la suite (comme dans l'exemple ci-dessus), vous devez utiliser
as
.Si vous ne souhaitez tester si l'objet est d'un type donné d'utiliser
is
et si vous êtes sûr que l'objet est d'un type donné (ou dérive de/met en œuvre ce type), alors vous pouvez lancerOriginalL'auteur Rune FS
Ok Nice réponses de tout le monde, mais permet de faire un peu de pratique. Dans votre propre code,c'est à dire non code du fournisseur de la puissance RÉELLE de mot-clé n'a pas de venir à l'avant.
Mais lorsque l'on traite avec le fournisseur d'objets comme dans WPF/silverlight puis COMME mot-clé est un véritable bonus.
par exemple si j'ai une série de contrôles sur une Toile et je souhaite suivre la piste thelast selectedControl, mais clairement, le suivi de grandeur lorsque je clique sur la Toile, je ferais ceci:
Une autre raison, c'utilisation COMME keyoword, c'est quand votre Classe implémente 1 ou plusieurs Interfaces et que vous voulez utiliser explicitement une seule interface:
Bien que pas vraiment nécessaire ici, il va affecter la valeur null à une variable obj si MyClass ne pas mettre en œuvre IMySecond
OriginalL'auteur GregJF
Ici est un extrait de http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html
La Equals1 méthode ci-dessus est plus efficace (et plus facile à lire) que Equals2, bien qu'ils obtiennent le même travail est fait. Alors que Equals1 compile à IL effectue la vérification du type et de la fonte exactement une fois, Equals2 compile de faire un type de comparaison d'abord pour le "est" de l'opérateur, et puis un type de comparaison et jetés ensemble en tant que partie de la () de l'opérateur. Donc, à l'aide de "que" dans ce cas est en fait plus efficace. Le fait qu'il est plus facile à lire est un bonus.
En conclusion, n'utilisez que le C# "comme" mot-clé, où vous vous attendez à de l'incantation à l'échec dans un non-cas exceptionnel. Si vous comptez sur un casting pour réussir et ne sont pas préparés à recevoir n'importe quel objet qui serait un échec, vous devez utiliser la (les) opérateur de cast, de sorte que des mesures appropriées et utiles exception est levée.
OriginalL'auteur Alex KeySmith