È sempre appropriato, ma considera attentamente le intenzioni dietro ciò che stai mostrando
Una domanda migliore sarebbe chiedere:
Perché si dovrebbe sovrascrivere ToString ()?
ToString () è la finestra sullo stato di un oggetto. Enfasi sullo stato come requisito. Linguaggi fortemente OOP come Java / C # abusano del modello OOP incapsulando tutto in una classe. Immagina di scrivere codice in un linguaggio che non segue il forte modello OOP; considera se useresti una classe o una funzione. Se vuoi usarlo come una funzione (cioè verbo, azione) e lo stato interno viene mantenuto solo temporaneamente tra input / output, ToString () non aggiunge valore.
Come altri hanno già detto, è importante considerare ciò che produci con ToString () perché potrebbe essere usato dal debugger o da altri sistemi.
Mi piace immaginare il metodo ToString come il parametro --help di un oggetto. Dovrebbe essere breve, leggibile, ovvio e facile da visualizzare. Dovrebbe mostrare ciò che l'oggetto non è ciò che fa . Con tutto ciò in mente, consideriamo ...
Caso d'uso - Analisi di un pacchetto TCP:
Non un'acquisizione di rete solo a livello di applicazione, ma qualcosa con più carne come un'acquisizione pcap.
Vuoi sovraccaricare ToString () solo per il livello TCP in modo da poter stampare i dati sulla console. Cosa includerebbe? Potresti impazzire e analizzare tutti i dettagli del TCP (cioè TCP è complesso) ...
Che include:
- Porta di origine
- Porto di destinazione
- Sequenza di numeri
- Numero di riconoscimento
- Offset dei dati
- bandiere
- Finestra Offset
- checksum
- Puntatore urgente
- Opzioni (non ci andrò nemmeno )
Ma vorresti ricevere tutta quella spazzatura se chiamassi TCP.ToString () su 100 pacchetti? Certo che no, sarebbe un sovraccarico di informazioni. La scelta facile e ovvia è anche la più sensata ...
Esponi ciò che le persone si aspettano di vedere:
- Porta di origine
- Porto di destinazione
Preferisco un output sensato che sia facile da analizzare per gli umani ma YMMV .
TCP:[destination:000, source:000]
Niente di complesso, l'output non è per le macchine da analizzare (cioè a meno che le persone non stiano abusando del tuo codice), lo scopo previsto è la leggibilità umana.
Ma per quanto riguarda il resto di quelle succose informazioni di cui ho parlato prima, non è utile anche questo? Ci arrivo, ma prima ...
ToString () uno dei metodi più preziosi e sottoutilizzati di tutti i tempi
Per due ragioni:
- Le persone non capiscono a cosa serve ToString ()
- Alla classe di base "Object" manca un altro metodo stringa altrettanto importante.
Motivo 1: non abusare dell'utilità di ToString ():
Molte persone usano ToString () per estrarre una semplice rappresentazione di stringa di un oggetto. Il manuale di C # afferma anche:
ToString è il principale metodo di formattazione in .NET Framework. Converte un oggetto nella sua rappresentazione di stringa in modo che sia adatto per la visualizzazione.
Schermo, non ulteriore elaborazione. Ciò non significa, prendi la mia bella rappresentazione di stringa del pacchetto TCP sopra e tira la porta sorgente usando una regex :: cringe ::.
Il diritto modo per fare le cose è chiamare ToString () direttamente sulla proprietà SourcePort (che BTW è un ushort quindi ToString () dovrebbe essere già disponibile).
Se hai bisogno di qualcosa di più robusto per impacchettare lo stato di un oggetto complesso per l'analisi della macchina, starai meglio usando una strategia di serializzazione strutturata.
Fortunatamente, tali strategie sono molto comuni:
- ISerializable (C #)
- Pickle (Python)
- JSON (Javascript o qualsiasi linguaggio che lo implementa)
- SAPONE
- eccetera...
Nota: a meno che tu non stia utilizzando PHP perché, herp-derp, esiste una funzione per questo :: snicker ::
Motivo 2 - ToString () non è sufficiente:
Devo ancora vedere un linguaggio che lo implementa al centro, ma ho visto e utilizzato variazioni di questo approccio in natura.
Alcuni dei quali includono:
- ToVerboseString ()
- ToString (= verbose vero)
Fondamentalmente, quel disordine peloso dello stato di un pacchetto TCP dovrebbe essere descritto per la leggibilità umana. Per evitare di "battere un cavallo morto" parlando di TCP, "punterò il dito" sul caso n. 1 in cui penso che ToString () e ToVerboseString () siano sottoutilizzati ...
Caso d'uso - Array:
Se utilizzi principalmente una lingua, probabilmente ti trovi bene con l'approccio di quella lingua. Per le persone come me che saltano tra lingue diverse, il numero di approcci diversi può essere irritante.
Cioè, il numero di volte che questo mi ha irritato è maggiore della somma di tutte le dita di ogni dio indù messe insieme.
Ci sono diversi casi in cui le lingue di uso comune hack e un paio che ottiene è giusto . Alcuni richiedono la reinvenzione delle ruote, alcuni eseguono uno scarico superficiale, altri uno scarico profondo, nessuno di loro funziona come vorrei ...
Quello che chiedo è un approccio molto semplice:
print(array.ToString());
Uscite: "Array [x]" o "Array [x] [y]"
Dove x è il numero di elementi nella prima dimensione ey è il numero di elementi nella seconda dimensione o un valore che indica che la seconda dimensione è frastagliata (l'intervallo min / max forse?).
E:
print(array.ToVerboseString());
Produce l'intera botta in caratteri carini perché apprezzo le cose carine.
Spero che questo faccia luce su un argomento che mi ha infastidito per molto tempo. Per lo meno ho spruzzato un po 'di troll-bait per i PHP per downvote questa risposta.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
o simili.