6
votes

C #: Toute différence que ce soit entre les données "(sous-type) et" données en tant que sous-type ".

En supposant que j'ai une instance d'un objet que je connaisse appartient à une sous-classe d'un certain sous-type m'a transmis à travers une référence d'un superype en C #, je suis habitué à voir la typée de ce type de forme de Java (en supposant " référence "est du superype): xxx

mais récemment, j'ai rencontré des exemples de ce qui semble être la même chose de cette façon: xxx

sont-ils complètement équivalents? Y a-t-il une différence?


16 commentaires

Pourriez-vous s'il vous plaît mettre quatre espaces avant le code, il est donc marqué comme code?


Merci pour le conseil! Je n'ai pas fait attention à ça.


Stackoverflow.com/questions/2483/... < / a>


Stackoverflow.com/Questtions/132445/...


Avez-vous même essayé de rechercher cette question?


J'ai cherché mais je n'ai pas pu trouver ces deux autres versions de la même question, merci de les pointer.


Oui, j'ai essayé de rechercher cette question BTW.


@ Swdevman81 - En toute justice, il ajoute l'assurance que la référence est en fait une instance de sous-type avant d'effectuer la distribution, que les autres questions ne semblent pas aborder très bien


@ Swdevman81 Bien que cela ne soit pas tout à fait la même (même s'il reçoit des réponses similaires).


C'est incroyable de la manière dont la fonctionnalité Nifty de la recherche de questions similaires dès que vous tapez le titre n'évite pas toutes les dupes que nous voyons tous les jours ...


Et comment les gens upvote les réponses qui ne répondent pas à la question ... 10 UPVOTes pour une réponse prise de l'une des autres questions qui n'ont rien à voir avec cette question ...


Ok, les gars, peut-être que la fonctionnalité de recherche ne fonctionne pas bien ni en favorisant les questions récentes. Je n'aime pas la demander des DuPes aussi, avant de demander que j'ai pris les précautions suivantes: - Recherchez à la fois "Typecast" + "C #" et "C #" + "C #" - regardé la "recherche que vous tapez des fonctionnalités", mais ces éléments précédents Les questions ne semblaient pas apparues. Maintenant, si vous recherchez ces termes, cette question apparaît. Devrions-nous nous abstenir de poser des questions dans la peur qu'ils auraient pu être posées auparavant lorsque nous ne pouvons pas les trouver?


@Fabio: "Devrions-nous nous abstenir ...?" Certainement pas. Cela ne me dérange pas que les gens posant des hauts "similaires" (par opposition à des "hauts" exacts "). Votre question ajoute réellement un nouveau facteur.


Celui qui a écrit l'exemple que vous montrez, qui utilise le mot-clé "comme" ne comprend évidemment pas pourquoi ils l'utilisent. Il est totalement redondant.


... et il n'y a pas de chèque pour NULL.


Vous les gars qui ont été plus actifs dans ce fil: J'ai du mal à choisir la bonne réponse. Certains d'entre eux ont ajouté des idées intéressantes mais je suppose que personne n'a tout ce qui était nécessaire.


7 Réponses :


-1
votes

Une chose importante à ce sujet est que, lors de l'utilisation de l'opérateur comme opérateur, ce type doit être nullable car, devrait-il échouer, il retournera Null. Alors que, utilisant la coulée de style C, jetera une exception lorsque la distribution ne peut pas être effectuée.


4 commentaires

Eh bien, il faut être dû au fait que "comme" ne fonctionne pas pour les types de valeur, et tous les types de référence sont nullables.


Et comment se fait-il que cela mérite A -1? Je pourrais dire un fait mais un fait est un fait.


Disclaimer: Je n'ai pas répondu. Vous ne pouvez pas simplement répondre aux faits pour être des faits. L'info-bulle sur la flèche vers le bas se lit comme suit: "Cette réponse n'est pas utile". C'est le but.


Je vous ai donné le -1 parce que cela n'a pas de sens. Le programme ne compilera pas si le type après le type «AS» est un type de valeur, alors pourquoi la peine de le dire du tout? En outre, cela n'a pas expliqué la différence entre les deux avant de modifier le poste.



1
votes

"comme" tente de lancer une référence au sous-type et retourne null, si elle échoue.
Coulée explicite lors de l'échec, jette InvalidcastException.


0 commentaires

11
votes

La différence est une différence qui lancera une exception et l'autre retournera une valeur null si le casting est incorrect. De plus, "comme" ne fonctionne pas sur le type de valeur.

BaseType _object;

//throw an exception
AnotherType _casted = (AnotherType) _object; 

//return null
AnotherType _casted = _object as AnotherType;


5 commentaires

Non, utilisé comme indiqué dans la question qui ne jettera pas non plus une exception.


Une fois que vous avez compris la différence, vous ne vous attendez pas vraiment à fonctionner sur un type de valeur, car les types de valeur ne sont jamais nuls.


La seule différence dans l'exemple op est la performance et le fait que la seconde ne fonctionne pas avec des types de valeur. La distribution fonctionnera toujours.


@Guffa: vrai, mais cela répond à l'essence de la question. La coulée incorrecte avec () jette des exceptions; Coulée incorrecte avec "comme" retourne null. C'est la principale différence.


@Guffa: Je suis d'accord avec vous que dans son exemple, le code ne lancera pas une exécution en raison de l'utilisation de "is" mot clé. Mais le titre de la question est "différence entre les données (sous-type) et les données en tant que sous-type". Je vais ajouter des éclaircissements pour inclure votre commentaire en considération.



1
votes

Non, ils ne sont pas équivalents. Le premier fonctionnera sur n'importe quel type, mais le deuxième exemple ne fonctionnera que sur les types de référence. La raison pour laquelle l'opérateur "comme" n'est valable que pour un type de référence.


2 commentaires

C'est à mi-chemin correct - comme ne fonctionnera pas sur les types de valeur de la vanille, mais cela fonctionnera sur des nullables, et c'est définitivement un point de différence.


@Pavel, des types nullables sont tellement étonnants spéciaux, il est difficile de les considérer comme des types de valeur plus :)



6
votes

Ils sont les mêmes utilisés de cette façon, mais non plus la meilleure option. Vous devez effectuer le type de vérification une seule fois:

subtype t = reference as subtype;
if (t != null) {
   ...
}


1 commentaires

Pour les types de référence, c'est le moyen de le faire. Pour les types de valeur, vous devez utiliser est + (coulé).



1
votes

1. aussi loin que je connais (Possolie obsolète) " comme " est plus rapide puis coulé.

Aucun de votre Des exemples sont optimaux. La manière optimale est la suivante: xxx

de cette manière, vous n'avez pas de problème à double casting.


3 commentaires

Le balisage de code vous aiderait à obtenir des votes. Il suffit de mettre quatre espaces avant votre code.


Je ne sais pas pourquoi, mais le code veut être formaté. J'ai essayé 4 espaces ... étrange. N'importe où ma réponse est dupliquée, alors pourquoi déranger?


@Mike - Apparemment, si vous commencez par une liste ordonnée et que vous mettez le code sous celui-ci, il le traite dans le cadre de la même ligne contenant le

  • - intéressant ...



  • 1
    votes

    http://msdn.microsoft.com/ EN-US / Bibliothèque / CSCSDFBT (vs.71) .aspx

    qui dit: "comme" égale à:

    expression est de type? (type) Expression: (type) null;

    Cela signifie que la seconde est une sorte de trop.


    1 commentaires

    Avec expression étant évalué une seule fois! Méfiez-vous des effets secondaires!