Les problèmes sont: p>
Tostring code> comme une représentation par défaut pour les classes. Là, il doit être localisé. Li>
-
tostring code> est utilisé pour la journalisation. Là, il devrait fournir des informations relatives à la programmation, n'est pas traduite et comprend des états internes tels que les clés de substitution et les valeurs d'enum. Li>
-
Tostring code> est utilisé par de nombreuses opérations de chaîne qui prennent des objets comme des arguments, par exemple string.format code>, lors de l'écriture sur les flux. En fonction du contexte, vous attendez quelque chose de différent. Li>
-
tostring code> est trop limité s'il existe de nombreuses représentations différentes du même objet, par exemple. une forme longue et une forme courte. li>
ul>
En raison des différents usages, il existe de nombreux types de mise en œuvre différents. Donc, ils sont trop peu fiables pour être vraiment utiles. P>
Comment ToString code> doit-il être mis en œuvre pour être utile? Quand faut-il utiliser TOSTRING CODE> quand doit-il être évité? P>
the Documentation Framework dit: p>
Cette méthode renvoie une lecture humaine
chaîne qui est sensible à la culture. p>
blockQuote>
Il y a un Question similaire , mais pas la même. p>
5 Réponses :
Cela dépend de l'utilisation indiquée de votre classe. De nombreuses classes n'ont pas de représentation de chaîne naturelle (c'est-à-dire un objet de formulaire). Ensuite, je voudrais mettre en œuvre une méthode informative (texte, taille, taille, etc.) utile lors du débogage. Si la classe est censée donner des informations à l'utilisateur, je voudrais mettre en œuvre une représentation par défaut de la valeur. Si vous avez un objet vectoriel par exemple, vous pouvez renvoyer le vecteur comme une coordonnée X et Y. Ici, j'ajouterais également des méthodes alternatives s'il existe d'autres moyens de décrire la classe. Donc, pour le vecteur, je pourrais ajouter une méthode qui renvoie une description comme angle et une longueur. P>
Pour débogage Vous pouvez également souhaiter ajouter l'attribut de débogueurDisplay à votre classe. Cela indique comment afficher la classe dans le débogueur, mais cela n'affecte pas la représentation des chaînes. p>
Vous voudrez peut-être également envisager de rendre la valeur renvoyée par TOSTRING pour être analytile afin que vous puissiez créer un objet à partir d'une représentation à chaîne. Comme si vous pouvez faire avec la méthode Int32.Parse. P>
Personnellement, je ne m'applique pas souvent. Dans de nombreux cas, cela ne ferait pas beaucoup de sens, car le rôle principal d'un type peut être em> pour définir le comportement, pas les données. Dans d'autres cas, cela n'a tout simplement pas d'importance car aucun client n'en a jamais besoin. P>
Dans tous les cas, voici quelques cas où il est logique (pas une liste exhaustive): p>
Je ne conviens pas qu'il existe un conflit entre les scénarios d'utilisation que vous énumérez. Lorsque l'affichage est l'objectif principal, TOSTRING doit fournir un texte convivial, mais pour la journalisation (ou plutôt comme vous le décrivez, pour le traçage) Je dirais que vous ne devriez pas suivre un élément spécifique à l'UI, mais plutôt un objet dont le but est d'écrire des données de trace détaillées. p>
Donc, il n'y a pas de conflit car il ne devrait pas être le même type selon le principe de responsabilité unique. P>
N'oubliez pas que vous pouvez toujours surcharger la méthode de totring si vous avez besoin de plus de contrôle. P>
Le problème avec "Aucun client n'en a jamais besoin" est que Tostring s'appelle implicitement. Le conflit se pose lorsque le même objet est utilisé dans différentes situations. DateTime est-il une classe spécifique à l'UI? De nombreuses classes ne sont pas conçues pour être utilisées uniquement pour l'interface utilisateur ou uniquement en interne. "Vous pouvez toujours surcharger le Tostring": c'est la question: comment devrait-elle être mise en œuvre alors?
Si vous utilisez le même objet dans des situations très différentes, je crois que vous enfreignez le SRP ... Non, DateTime n'est pas une classe particulièrement spécifique à l'assurance-emploi, mais elle tombe dans la catégorie de la réalisation de totring / parsemes de déplacement sans données perte.
Voici un bel article qui explique Système primordial .Object.Tostring () et mettre en œuvre IFormattable P>
Lien brisé W / 503 Erreur!
Il semble que vous ayez de grandes attentes d'une minuscule petite méthode :) Autant que je sache que ce n'est pas une bonne idée d'utiliser une méthode générale dans tant de contextes différents spécialement différents lorsque son comportement peut différer de la classe en classe. P >
Voici mes suggestions: p>
1.De ne laissez pas les bibliothèques d'interface graphique d'interface graphique () de vos objets.Instead Utilisez des propriétés plus significatives (presque tous les commandes peuvent être personnalisées pour afficher d'autres propriétés que la totrage) Par exemple, utilisez l'affichage. 2.Quand Obtenir des informations sur un objet (pour la journalisation ou d'autres usages), laissez quelqu'un décider (un autre objet ou l'objet lui-même) ce qui devrait être fourni et comment il devrait être affiché. (Un modèle de stratégie peut être utile) P >
Je ne m'attendrais pas autant si cela ne serait pas appelé implicitement partout. Mais tu as probablement raison. Je devrais éviter que cela soit implicitement utilisé dans l'interface utilisateur.
Une autre ride à considérer est l'intégration étroite entre le débogueur de Tostring et Visual Studio. La fenêtre de surveillance affiche le résultat de la valeur de la valeur de l'expression, de sorte que si votre méthode effectue une chargement paresseuse, a des effets secondaires, ou prend une longue période, vous pouvez voir un comportement étrange ou le débogueur peut sembler suspendre . Certes, ces qualités ne sont pas la marque d'une méthode de totring bien conçue, mais elles se produisent (par exemple, une analyse naïf "de la traduction de la base de données" Mise en œuvre). P>
Par conséquent, je considère que la méthode de totring par défaut (sans paramètres) est un crochet de débogage de studio visuel - avec l'implication qu'il ne doit généralement pas être surchargé à utiliser par le programme en dehors d'un contexte de débogage. p>
tandis que ceux de ce que celles de la connaissance des attributs de débogage (DebuggertypeProxyATtribute, DebuggerDisplayAttribute, DebuggerBrowSaRowSaTribute, Beaucoup (y compris moi-même) considèrent généralement que la production par défaut générée par Tostring et affichée dans les fenêtres de la montre sont suffisamment bonnes. < / p>
Je comprends que ceci est une perspective assez stricte - écrivant de la touche de débogage en tant que crochet de débogage - mais je constate que la mise en œuvre iformattable semble être la voie la plus fiable et la plus extensible. P>