Zawsze jest to właściwe, ale dokładnie rozważ intencje stojące za tym, co wyświetlasz
Lepszym pytaniem byłoby zadać:
Dlaczego jeden miałby zastąpić ToString ()?
ToString () jest oknem do stanu obiektu. Nacisk na państwo jako wymóg. Zdecydowanie języki OOP, takie jak Java / C #, nadużywają modelu OOP, hermetyzując wszystko w klasie. Wyobraź sobie, że kodujesz w języku, który nie jest zgodny z silnym modelem OOP; zastanów się, czy użyjesz klasy czy funkcji. Jeśli użyjesz go jako funkcji (tj. Czasownika, akcji), a stan wewnętrzny jest utrzymywany tylko tymczasowo między wejściem / wyjściem, ToString () nie doda wartości.
Jak wspominali inni, ważne jest, aby wziąć pod uwagę to , co wyprowadzasz za pomocą ToString (), ponieważ może być używane przez debuger lub inne systemy.
Lubię wyobrażać sobie metodę ToString jako parametr --help obiektu. Powinien być krótki, czytelny, oczywisty i łatwy do wyświetlenia. Powinien pokazywać to, czym obiekt nie jest tym, co robi . Mając to wszystko na uwadze, rozważmy ...
Przykład zastosowania - analizowanie pakietu TCP:
Nie jest to przechwytywanie sieci tylko na poziomie aplikacji, ale coś bardziej mięsistego, jak przechwytywanie PCAP.
Chcesz przeciążać ToString () tylko dla warstwy TCP, aby móc drukować dane na konsoli. Co by to zawierało? Możesz oszaleć i przeanalizować wszystkie szczegóły TCP (tj. TCP jest złożony) ...
Który obejmuje:
- Port źródłowy
- Port docelowy
- Numer sekwencji
- Numer potwierdzenia
- Przesunięcie danych
- Flagi
- Przesunięcie okna
- Suma kontrolna
- Pilny wskaźnik
- Opcje ( nawet nie zamierzam tam iść)
Ale czy chciałbyś otrzymać wszystkie te śmieci, gdybyś wywoływał TCP.ToString () na 100 pakietach? Oczywiście, że nie, byłoby to przeładowanie informacjami. Łatwy i oczywisty wybór jest też najbardziej rozsądny ...
Pokaż, czego ludzie oczekiwaliby zobaczyć:
- Port źródłowy
- Port docelowy
Wolę rozsądne wyjście, które jest łatwe do przeanalizowania przez ludzi, ale YMMV .
TCP:[destination:000, source:000]
Nic skomplikowanego, dane wyjściowe nie są przeznaczone do analizowania przez maszyny (tj. Chyba, że ludzie nadużywają twojego kodu), zamierzonym celem jest czytelność dla ludzi.
Ale co z resztą tych soczystych informacji, o których mówiłem wcześniej, czy to też nie jest przydatne? Dojdę do tego, ale najpierw ...
ToString () to jedna z najbardziej wartościowych i rzadko wykorzystywanych metod wszechczasów
Z dwóch powodów:
- Ludzie nie rozumieją, do czego służy ToString ()
- W podstawowej klasie „Object” brakuje innej, równie ważnej metody łańcuchowej.
Powód 1 - nie nadużywaj użyteczności ToString ():
Wiele osób używa ToString () do ściągnięcia prostej reprezentacji obiektu w postaci ciągu. Podręcznik języka C # stwierdza nawet:
ToString to główna metoda formatowania w .NET Framework. Konwertuje obiekt na jego reprezentację w postaci ciągu, aby nadawał się do wyświetlania.
Wyświetl, a nie dalsze przetwarzanie. To nie znaczy, weź moją ładną reprezentację łańcuchową pakietu TCP powyżej i ściągnij port źródłowy za pomocą regex :: cringe ::.
Prawy sposób robić rzeczy jest ToString call () bezpośrednio na posesji SourcePort (który przy okazji jest ushort tak toString () powinna być już dostępna).
Jeśli potrzebujesz czegoś bardziej niezawodnego do spakowania stanu złożonego obiektu do analizowania maszynowego, lepiej będzie, używając strategii serializacji strukturalnej.
Na szczęście takie strategie są bardzo powszechne:
- ISerializable (C #)
- Pickle (Python)
- JSON (JavaScript lub dowolny język, który go implementuje)
- MYDŁO
- itp...
Uwaga: Chyba że używasz PHP, ponieważ, herp-derp, jest do tego funkcja :: snicker ::
Powód 2 - ToString () nie wystarczy:
Nie widziałem jeszcze języka, który implementowałby to u podstaw, ale widziałem i stosowałem różne odmiany tego podejścia na wolności.
Niektóre z nich obejmują:
- ToVerboseString ()
- ToString (verbose = true)
Zasadniczo ten włochaty bałagan w stanie pakietu TCP powinien być opisany dla czytelności dla ludzi. Aby uniknąć `` bicia martwego konia '' mówiącego o TCP, `` wskażę palcem '' przypadek nr 1, w którym myślę, że ToString () i ToVerboseString () są niedostatecznie wykorzystywane ...
Przykład zastosowania - tablice:
Jeśli używasz głównie jednego języka, prawdopodobnie czujesz się komfortowo z jego podejściem. Dla ludzi takich jak ja, którzy przeskakują między różnymi językami, liczba różnych podejść może być irytująca.
To znaczy, ile razy mnie to irytowało, przekracza sumę wszystkich palców każdego hinduskiego boga razem wziętych.
Istnieją różne przypadki, w których języki używają wspólnych hacki i mało , że się go w prawo . Niektórzy wymagają ponownego wynalezienia koła, niektórzy robią płytkie wysypisko, inni robią głębokie wysypisko, żaden z nich nie działa tak, jak bym chciał ...
Proszę o bardzo proste podejście:
print(array.ToString());
Dane wyjściowe: „Tablica [x]” lub „Tablica [x] [y]”
Gdzie x to liczba elementów w pierwszym wymiarze, a y to liczba elementów w drugim wymiarze lub pewna wartość wskazująca, że drugi wymiar jest postrzępiony (może zakres min / max?).
I:
print(array.ToVerboseString());
Całość ładnie drukuje, ponieważ cenię ładne rzeczy.
Miejmy nadzieję, że rzuca to trochę światła na temat, który irytował mnie od dawna. Przynajmniej posypałem małą przynętę na trolle dla PHPersów, aby zignorowali tę odpowiedź.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
lub czegoś podobnego.