Pergunta

Os problemas são:

  • GUI bibliotecas como a utilização ToString como uma representação padrão para classes. É preciso que ele seja localizado.
  • ToString é usado para registro. Não deve fornecer programação de informações relacionadas, não é traduzida e inclui estados internos como chaves substitutas e valores enum.
  • ToString é usado por muitas operações de cadeia que levam objetos como argumentos, por exemplo String.Format, ao escrever aos córregos. Dependendo do contexto que você espera algo diferente.
  • ToString é muito limitada se houver muitas representações diferentes do mesmo objeto, por exemplo. um longo e um pequeno formulário.

Por causa dos diferentes usos, existem muitos tipos diferentes de implementação. Então eles são muito pouco confiáveis ??para ser realmente útil.

Como deve ToString ser implementado para ser útil? Quando deve ToString ser usado, quando deveria ser evitada?


O .NET Framework documentação diz:

Este método retorna uma legível string que é sensível à cultura.

Há um pergunta semelhante , mas não o mesmo.

Foi útil?

Solução

Parece que você tem grandes expectativas de um método pouco minúsculo :) Tanto quanto eu sei que não é uma boa idéia usar um método geral em tantos contextos diferentes, especialmente quando o seu comportamento pode variar de classe para classe.

Aqui está a minha sugestão:

1.Do não deixar bibliotecas GUI usar ToString () do seu uso objects.Instead propriedades mais significativos (quase todos os controles podem ser personalizados para mostrar outras propriedades do que ToString) por exemplo utilizar DisplayMember. 2.When obter algumas informações sobre um objeto (para registro ou outros usos) deixar alguém decidir (outro objeto ou o objeto em si) que deve ser fornecido e como ele deve ser exibido. (A padrão de estratégia pode vir a calhar)

Outras dicas

Depende do uso indended de sua classe. Muitas classes não têm uma representação de cadeia natural (ou seja, uma forma de objeto). Então eu iria implementar ToString como um método informativo (texto Form, tamanho e assim por diante) útil ao depurar. Se a classe se destina a dar informações para o usuário, então eu iria implementar ToString como uma representação padrão do valor. Se você tem um objeto Vector por exemplo, então ToString pode devolver o vector como um X e Y coordenadas. Aqui eu também gostaria de acrescentar métodos alternativos se há outras maneiras de descrever a classe. Assim, para o Vector eu poderia adicionar um método que retorna uma descrição como um ângulo e uma lenght.

Para fins de depuração você também pode querer adicionar o atributo DebuggerDisplay a sua classe. Isto diz como exibir a classe no depurador, mas não afeta a representação de cadeia.

Você também pode querer considerar fazer o valor retornado pelo ToString ser tão parseable que você pode criar um objeto a partir de uma representação de cadeia. Como você pode fazer com o método Int32.Parse.

Outra rugas a considerar é a forte integração entre ToString e depurador do Visual Studio. A janela do relógio exibe o resultado de ToString como o valor da expressão, por isso, se seus executa método qualquer carregamento lento, tem quaisquer efeitos colaterais, ou leva um longo tempo, então você pode ver o comportamento estranho ou o depurador pode parecer travar . Concedido, essas qualidades não são a marca de um método ToString bem desenhado, mas eles acontecem (por exemplo, um ingênuo "buscar a tradução da base de dados" implementação).

Por isso, considero o método ToString padrão (sem parâmetros) para ser um Visual Studio depuração gancho - com a implicação de que ele não deve, geralmente, ser sobrecarregado para uso pelo programa fora de um contexto de depuração.

Enquanto aqueles na alavancagem conhecer os atributos de depuração (DebuggerTypeProxyAttribute, DebuggerDisplayAttribute, DebuggerBrowsableAttribute) para personalizar o depurador, muitos (inclusive eu) geralmente consideram a saída padrão como gerada por ToString e exibido nas janelas relógio para ser bom o suficiente.

Eu entendo que esta é uma perspectiva bastante rigorosa - escrevendo fora ToString como um gancho depurador - mas eu acho que a implementação IFormattable parece ser a rota mais confiável e extensível

.

Pessoalmente, eu não implementar ToString que muitas vezes. Em muitos casos, não faria muito sentido, uma vez que o papel principal de um tipo pode ser para definir o comportamento, não dados. Em outros casos, ele simplesmente não importa, porque nenhum cliente precisar dele.

Em qualquer caso, aqui estão alguns casos onde faz sentido (não é uma lista exaustiva):

  • Se o resultado da ToString poderia concebível ser analisado de volta para uma instância do tipo sem perda de dados.
  • Quando o tipo tem um simples valor (ou seja, não complexo).
  • Quando o objetivo principal do tipo é para formatar dados em texto.

Eu não concordo que existe um conflito entre os cenários de uso que você lista. Quando a visualização é o objetivo principal, ToString deve fornecer um texto user-friendly, mas para o registo (ou melhor, como você descrevê-lo, para rastreamento) eu diria que você não deve ser traçado um elemento específico da UI em qualquer caso, mas sim um objeto cujo propósito é escrever dados de rastreamento detalhadas.

Portanto, não há conflito, porque ele não deve ser do mesmo tipo de acordo com a responsabilidade única Princípio.

Lembre-se que você sempre pode sobrecarregar o método ToString se você precisar de mais controle.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top