Siempre es apropiado, pero considere cuidadosamente las intenciones detrás de lo que está mostrando.
Una mejor pregunta sería preguntar:
¿Por qué se anularía ToString ()?
ToString () es la ventana al estado de un objeto. Énfasis en el estado como requisito. Los lenguajes fuertemente orientados a objetos como Java / C # abusan del modelo de programación orientada a objetos encapsulando todo en una clase. Imagina que estás codificando en un lenguaje que no sigue el modelo fuerte de OOP; considere si usaría una clase o una función. Si lo usa como una función (es decir, verbo, acción) y el estado interno solo se mantiene temporalmente entre la entrada / salida, ToString () no agregará valor.
Como otros han mencionado, es importante considerar lo que genera con ToString () porque podría ser utilizado por el depurador u otros sistemas.
Me gusta imaginar el método ToString como el parámetro --help de un objeto. Debe ser breve, legible, obvio y fácil de mostrar. Debe mostrar lo que el objeto no es lo que hace . Con todo eso en mente, consideremos ...
Caso de uso: análisis de un paquete TCP:
No es una captura de red solo a nivel de aplicación, sino algo con más carne como una captura pcap.
Desea sobrecargar ToString () solo para la capa TCP para poder imprimir datos en la consola. ¿Qué incluiría? Podría volverse loco y analizar todos los detalles de TCP (es decir, TCP es complejo) ...
Que incluye:
- Puerto de origen
- Puerto de destino
- Secuencia de números
- Número de acuse de recibo
- Desplazamiento de datos
- Banderas
- Desplazamiento de ventana
- Suma de comprobación
- Puntero urgente
- Opciones (ni siquiera voy a ir)
Pero, ¿le gustaría recibir toda esa basura si estuviera llamando a TCP.ToString () en 100 paquetes? Por supuesto que no, sería una sobrecarga de información. La elección fácil y obvia es también la más sensata ...
Exponga lo que la gente esperaría ver:
- Puerto de origen
- Puerto de destino
Prefiero una salida sensible que sea fácil de analizar para los humanos, pero YMMV .
TCP:[destination:000, source:000]
Nada complejo, la salida no es para que las máquinas la analicen (es decir, a menos que las personas estén abusando de su código), el propósito previsto es la legibilidad humana.
Pero, ¿qué pasa con el resto de esa jugosa información de la que hablé antes? ¿No es eso útil también? Llegaré a eso, pero primero ...
ToString () uno de los métodos más valiosos y subutilizados de todos los tiempos
Por dos razones:
- La gente no entiende para qué sirve ToString ()
- A la clase base 'Objeto' le falta otro método de cadena igualmente importante.
Razón 1: no abuse de la utilidad de ToString ():
Mucha gente usa ToString () para extraer una representación de cadena simple de un objeto. El manual de C # incluso dice:
ToString es el método de formateo principal en .NET Framework. Convierte un objeto en su representación de cadena para que sea adecuado para su visualización.
Monitor, sin procesamiento adicional. Eso no significa que tome mi bonita representación de cadena del paquete TCP anterior y extraiga el puerto de origen usando una expresión regular :: cringe ::.
El derecho forma de hacer las cosas es llamar a ToString () directamente en la propiedad SourcePort (que por cierto es un ushort, por lo que ToString () ya debería estar disponible).
Si necesita algo más robusto para empaquetar el estado de un objeto complejo para el análisis automático, será mejor que utilice una estrategia de serialización estructurada.
Afortunadamente, estas estrategias son muy comunes:
- ISerializable (C #)
- Pepinillo (Python)
- JSON (Javascript o cualquier lenguaje que lo implemente)
- JABÓN
- etc ...
Nota: A menos que esté usando PHP porque, herp-derp, hay una función para eso :: snicker ::
Razón 2: ToString () no es suficiente:
Todavía tengo que ver un lenguaje que implemente esto en el núcleo, pero he visto y usado variaciones de este enfoque en la naturaleza.
Algunos de los cuales incluyen:
- ToVerboseString ()
- ToString (detallado = verdadero)
Básicamente, ese desorden peludo del estado de un paquete TCP debería describirse para la legibilidad humana. Para evitar 'vencer a un caballo muerto' hablando de TCP, 'señalaré con el dedo' el caso # 1 donde creo que ToString () y ToVerboseString () están infrautilizados ...
Caso de uso: matrices:
Si usa principalmente un idioma, probablemente se sienta cómodo con el enfoque de ese idioma. Para personas como yo, que pasan de un idioma a otro, la variedad de enfoques puede resultar irritante.
Es decir, la cantidad de veces que esto me ha irritado es mayor que la suma de todos los dedos de cada dios hindú combinados.
Hay varios casos en los idiomas de uso común hacks y un pocos que consiguen que la derecha . Algunos requieren la reinvención de la rueda, algunos hacen un volcado poco profundo, otros hacen un volcado profundo, ninguno de ellos funciona como me gustaría ...
Lo que estoy pidiendo es un enfoque muy simple:
print(array.ToString());
Salidas: 'Array [x]' o 'Array [x] [y]'
Donde x es el número de elementos en la primera dimensión e y es el número de elementos en la segunda dimensión o algún valor que indique que la segunda dimensión es irregular (¿rango mínimo / máximo tal vez?).
Y:
print(array.ToVerboseString());
Imprime todo el she-bang en letras bonitas porque aprecio las cosas bonitas.
Con suerte, esto arroja algo de luz sobre un tema que me ha molestado durante mucho tiempo. Por lo menos, esparcí un pequeño cebo para que los PHPers votaran negativamente esta respuesta.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
o similar.