É sempre apropriado, mas considere cuidadosamente as intenções por trás do que você está exibindo
Uma pergunta melhor seria fazer:
Por que alguém substituiria ToString ()?
ToString () é a janela para o estado de um objeto. Ênfase no estado como um requisito. Linguagens fortemente OOP como Java / C # abusam do modelo OOP encapsulando tudo em uma classe. Imagine que você está codificando em uma linguagem que não segue o modelo OOP forte; considere se você usaria uma classe ou uma função. Se você for usá-lo como uma função (ou seja, verbo, ação) e o estado interno for mantido apenas temporariamente entre a entrada / saída, ToString () não adicionará valor.
Como outros mencionaram, é importante considerar o que você produz com ToString () porque ele pode ser usado pelo depurador ou outros sistemas.
Gosto de imaginar o método ToString como o parâmetro --help de um objeto. Deve ser curto, legível, óbvio e fácil de exibir. Deve mostrar o que o objeto não é o que faz . Com tudo isso em mente, vamos considerar ...
Caso de uso - analisando um pacote TCP:
Não é uma captura de rede apenas no nível do aplicativo, mas algo com mais carne, como uma captura pcap.
Você deseja sobrecarregar ToString () apenas para a camada TCP para que possa imprimir dados no console. O que isso incluiria? Você poderia enlouquecer e analisar todos os detalhes do TCP (ou seja, o TCP é complexo) ...
Que inclui:
- Porta Fonte
- Porto de destino
- Número sequencial
- Número de confirmação
- Deslocamento de dados
- Bandeiras
- Deslocamento da janela
- Checksum
- Ponteiro Urgente
- Opções (eu nem vou lá)
Mas você gostaria de receber todo esse lixo se estivesse chamando TCP.ToString () em 100 pacotes? Claro que não, seria sobrecarga de informação. A escolha fácil e óbvia também é a mais sensata ...
Exponha o que as pessoas esperariam ver:
- Porta Fonte
- Porto de destino
Eu prefiro uma saída sensata que seja fácil para humanos analisar, mas YMMV .
TCP:[destination:000, source:000]
Nada complexo, a saída não é para ser analisada por máquinas (ou seja, a menos que as pessoas estejam abusando do seu código), a finalidade pretendida é para legibilidade humana.
Mas e todo o resto daquela informação suculenta de que falei antes, não é útil também? Vou chegar lá, mas primeiro ...
ToString () um dos métodos mais valiosos e subutilizados de todos os tempos
Por dois motivos:
- As pessoas não entendem para que serve ToString ()
- A classe base 'Object' não tem outro método de string igualmente importante.
Razão 1 - Não abuse da utilidade de ToString ():
Muitas pessoas usam ToString () para obter uma representação de string simples de um objeto. O manual C # ainda afirma:
ToString é o principal método de formatação no .NET Framework. Ele converte um objeto em sua representação de string para que seja adequado para exibição.
Exibição, sem processamento adicional. Isso não significa, pegue minha bela representação de string do pacote TCP acima e puxe a porta de origem usando um regex :: cringe ::.
A maneira certa de fazer as coisas é chamar ToString () diretamente na propriedade SourcePort (que BTW é um ushort, então ToString () já deve estar disponível).
Se você precisa de algo mais robusto para empacotar o estado de um objeto complexo para análise de máquina, será melhor usar uma estratégia de serialização estruturada.
Felizmente, essas estratégias são muito comuns:
- ISerializable (C #)
- Pickle (Python)
- JSON (Javascript ou qualquer linguagem que o implemente)
- SABONETE
- etc ...
Nota: A menos que você esteja usando PHP porque, herp-derp, há uma função para isso :: snicker ::
Razão 2 - ToString () não é suficiente:
Ainda estou para ver uma linguagem que implemente isso no núcleo, mas tenho visto e usado variações dessa abordagem na selva.
Algumas das quais incluem:
- ToVerboseString ()
- ToString (verbose = true)
Basicamente, essa bagunça cabeluda do estado de um pacote TCP deve ser descrita para facilitar a leitura humana. Para evitar 'bater em um cavalo morto' falando sobre TCP, irei 'apontar o dedo' para o caso nº 1 onde eu acho que ToString () e ToVerboseString () são subutilizados ...
Caso de uso - Arrays:
Se você usa principalmente um idioma, provavelmente está confortável com a abordagem desse idioma. Para pessoas como eu, que alternam entre idiomas diferentes, o número de abordagens variadas pode ser irritante.
Ou seja, o número de vezes que isso me irritou é maior do que a soma de todos os dedos de todos os deuses hindus combinados.
Há vários casos em que línguas uso comum hacks e um poucos que obter -lo direito . Alguns exigem a reinvenção da roda, alguns fazem um despejo raso, outros fazem um despejo profundo, nenhum deles funciona da maneira que eu gostaria ...
O que estou pedindo é uma abordagem muito simples:
print(array.ToString());
Saídas: 'Array [x]' ou 'Array [x] [y]'
Onde x é o número de itens na primeira dimensão ey é o número de itens na segunda dimensão ou algum valor que indica que a 2ª dimensão é denteada (intervalo mínimo / máximo talvez?).
E:
print(array.ToVerboseString());
Produz todo o she-bang em letras bonitas porque eu aprecio coisas bonitas.
Espero que isso lance alguma luz sobre um tópico que me incomoda há muito tempo. No mínimo, espalhei uma pequena isca de troll para que os PHPers votassem negativamente nessa resposta.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
ou semelhante.