Pregunta

Los problemas son:

  • A las bibliotecas GUI les gusta usar ToString como una representación predeterminada para las clases. Allí debe ser localizado.
  • ToString se utiliza para el registro. Allí debe proporcionar información relacionada con la programación, no se traduce e incluye estados internos como claves sustitutas y valores de enumeración.
  • ToString es utilizado por muchas operaciones de cadena que toman objetos como argumentos, por ejemplo String.Format , al escribir en secuencias. Dependiendo del contexto, espera algo diferente.
  • ToString es demasiado limitado si hay muchas representaciones diferentes del mismo objeto, por ejemplo. una forma larga y corta.

Debido a los diferentes usos, hay muchos tipos diferentes de implementación. Así que son demasiado poco confiables para ser realmente útiles.

¿Cómo se debe implementar ToString para que sea útil? ¿Cuándo debe usarse ToString , cuándo debe evitarse?


La documentación de .NET Framework dice:

  

Este método devuelve una lectura humana   cadena sensible a la cultura.

Hay una pregunta similar , pero no la misma.

¿Fue útil?

Solución

Parece que tiene grandes expectativas de un pequeño método :) Hasta donde sé, no es una buena idea usar un método general en tantos contextos diferentes, especialmente cuando su comportamiento puede diferir de una clase a otra.

Aquí están mis sugerencias:

1.No permita que las bibliotecas GUI usen ToString () de sus objetos. En lugar de eso, use propiedades más significativas (casi todos los controles se pueden personalizar para mostrar otras propiedades que ToString) por ejemplo usa DisplayMember. 2. Al obtener información sobre un objeto (para iniciar sesión u otros usos), deje que alguien decida (otro objeto o el objeto mismo) qué se debe proporcionar y cómo se debe mostrar. (Un patrón de estrategia puede ser útil)

Otros consejos

Depende del uso apropiado de tu clase. Muchas clases no tienen una representación de cadena natural (es decir, un objeto de formulario). Luego implementaría ToString como un método informativo (texto de formulario, tamaño, etc.) útil al depurar. Si la clase está destinada a proporcionar información al usuario, implementaría ToString como una representación predeterminada del valor. Si tiene un objeto Vector, por ejemplo, entonces ToString podría devolver el vector como una coordenada X e Y. Aquí también agregaría métodos alternativos si hay otras formas de describir la clase. Por lo tanto, para el vector, podría agregar un método que devuelva una descripción como ángulo y longitud.

Para propósitos de depuración, es posible que también desee agregar el atributo DebuggerDisplay a su clase. Esto indica cómo mostrar la clase en el depurador, pero no afecta la representación de la cadena.

También puede considerar hacer que el valor devuelto por ToString sea analizable para que pueda crear un objeto a partir de una representación de cadena. Como puede hacer con el método Int32.Parse.

Otra arruga a considerar es la estrecha integración entre ToString y el depurador de Visual Studio. La ventana de Observación muestra el resultado de ToString como el valor de la expresión, por lo que si su método realiza una carga perezosa, tiene efectos secundarios o lleva mucho tiempo, es posible que vea un comportamiento extraño o que el depurador parezca que se cuelga. . Por supuesto, estas cualidades no son la marca de un método ToString bien diseñado, pero ocurren (por ejemplo, una ingenua " recupera la traducción de la implementación de la base de datos).

En consecuencia, considero que el método ToString predeterminado (sin parámetros) es un enlace de depuración de Visual Studio, con la implicación de que, por lo general, el programa no debe sobrecargarlo para usarlo fuera de un contexto de depuración.

Mientras que los que están al tanto aprovechan los atributos de depuración (DebuggerTypeProxyAttribute, DebuggerDisplayAttribute, DebuggerBrowsableAttribute) para personalizar el depurador, muchos (incluido yo mismo) generalmente consideran que la salida predeterminada generada por ToString y que se muestra en las ventanas de Vigilancia es buena. / p>

Comprendo que esta es una perspectiva bastante estricta: descartar ToString como un enlace de depuración, pero creo que implementar IFormattable parece ser la ruta más confiable y extensible.

Personalmente, no implemento ToString con tanta frecuencia. En muchos casos, no tendría mucho sentido, ya que la función principal de un tipo puede ser definir el comportamiento, no los datos. En otros casos, simplemente no importa porque ningún cliente lo necesita.

En cualquier caso, aquí hay algunos casos en los que tiene sentido (no una lista exhaustiva):

  • Si el resultado de ToString se pudiera analizar de nuevo en una instancia del tipo sin pérdida de datos.
  • Cuando el tipo tiene un valor simple (es decir, no complejo).
  • Cuando el propósito principal del tipo es formatear los datos en texto.

No estoy de acuerdo en que exista un conflicto entre los escenarios de uso que usted enumera. Cuando la visualización es el propósito principal, ToString debería proporcionar un texto fácil de usar, pero para el registro (o, mejor dicho, como lo describe, para el rastreo) diría que no debería rastrear un elemento específico de la interfaz de usuario en cualquier caso, sino más bien un objeto cuyo propósito es escribir datos de rastreo detallados.

Por lo tanto, no hay conflicto porque no debería ser del mismo tipo según el Principio de Responsabilidad Única.

Recuerde que siempre puede sobrecargar el método ToString si necesita más control.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top