10
votes

.Tostring (), (string) ou en chaîne. Quand utiliser quoi?

J'ai couru dans un bug qui me dérangeait. J'avais Jobject que je pensais irait bien avec xxx

la chaîne était là et tout. Un complexe final devait passer à un xxx

juste pour voir ce qui se passe et ça marche. Ma question est de savoir comment puis-je savoir quand utiliser un .tostring () par opposition à une (chaîne) par opposition à une "chaîne".


0 commentaires

3 Réponses :


21
votes

Si l'objet est une chaîne code> code> ou un opérateur de distribution explicite à (chaîne) code>, il est acceptable de dire xxx pré>

Sinon, cela vous donnera un InvalidCastException code>. p>

Notez que vous pouvez dire ici P> xxx pré>

qui définira s code> sur null code> si obj ["rôle"] code> n'est pas une instance de chaîne code>. Notez que pour comme code>, des opérateurs de distribution explicites sont ignorés. strong> p>

si obj ["rôle"] n'est ni un String CODE> NOR Une instance d'une classe qui a un opérateur de distribution explicite à String code>, vous devez dire P>

string s = obj["role"].ToString();


6 commentaires

Tous les objets in .NET hérit de system.Object qui a un .tostring () méthode - je n'ai pas encore trouvé un objet qui lancera une référence null simplement pour appeler simplement pour appeler .tostring () dessus - avant i -1, pouvez-vous donner un exemple?


@Basiclife: si obj ["rôle"] est null , puis obj ["rôle"]. Tostring () lancera un NullReferenceException Parce que nous essayons de désirer une référence null .


J'ai vu du code comme string S = (obj ["rôle"] ?? string.empty) .tostring (); pour éviter le NullReferenceException . Ne pouvait pas dire si c'est une bonne pratique ou non.


@Jason - alors c'est vraiment un problème d'index plutôt que d'un .tostring () problème - mais dans tout cas, bonne réponse, +1 :)


@Basiclife: Je veux dire, c'est une façon de regarder ça. Mais la grande chose est que j'ai rencontré beaucoup de personnes qui ont l'intuition que x.tostring () devrait renvoyer null (et dans certains cas chaîne .Empty ) si x est null , ne réalisant pas qu'ils essaient de Derefence un null référence.


J'aime l'explication détaillée. Merci!



2
votes

(chaîne) jette l'instance à la chaîne et il pourrait lancer une exception au moment de l'exécution si l'objet que vous essayez de lancer n'est pas une chaîne. Le comme opérateur tente également de lancer mais Cela ne jette pas une exception si l'instance n'est pas une chaîne mais retourne null. Et le tostring méthode Bien sûr vient de System.Object afin que cela dépendra de savoir si Tyhe sous-jacent de type l'a remplacé.


0 commentaires

0
votes

Cela ne devrait pas faire une différence dans votre exemple. Le seul scénario où il ferait la différence est s'il ya une conversion de type utilisateur (sur une chaîne ) définie sur le type obj ["rôle"] est. Dans ce cas, il est peut-être que la distribution à une chaîne a changé sur un autre objet, sur lequel le .tostring () a été mis en œuvre différemment.


0 commentaires