Это всегда уместно, но внимательно рассматривайте намерения, стоящие за тем, что вы показываете.
Лучше спросить:
Зачем переопределять ToString ()?
ToString () - это окно в состояние объекта. Упор на состояние как требование. Языки с сильным ООП, такие как Java / C #, злоупотребляют моделью ООП, инкапсулируя все в классе. Представьте, что вы пишете код на языке, который не следует строгой модели ООП; подумайте, будете ли вы использовать класс или функцию. Если вы будете использовать его как функцию (например, глагол, действие), а внутреннее состояние поддерживается только временно между вводом / выводом, ToString () не будет добавлять значение.
Как уже упоминалось другими, важно учитывать то, что вы выводите с помощью ToString (), потому что это может использоваться отладчиком или другими системами.
Мне нравится представлять метод ToString как параметр --help объекта. Он должен быть коротким, читаемым, очевидным и легко отображаемым. Он должен отображать то, что объект не является тем, что он делает . Имея это в виду, давайте рассмотрим ...
Пример использования - разбор TCP-пакета:
Не захват сети только на уровне приложения, а что-то более содержательное, например захват pcap.
Вы хотите перегрузить ToString () только для уровня TCP, чтобы вы могли печатать данные на консоли. Что в него входит? Вы можете сойти с ума и проанализировать все детали TCP (т.е. TCP сложен) ...
Что включает в себя:
- Исходный порт
- Порт назначения
- Последовательность чисел
- Номер подтверждения
- Смещение данных
- Флаги
- Смещение окна
- Контрольная сумма
- Срочный указатель
- Варианты (я даже туда не пойду)
Но хотели бы вы получать весь этот мусор, если бы вызывали TCP.ToString () для 100 пакетов? Конечно, нет, это будет информационная перегрузка. Простой и очевидный выбор также самый разумный ...
Раскройте то, что люди ожидают увидеть:
- Исходный порт
- Порт назначения
Я предпочитаю разумный вывод, который легко анализировать людям, но не YMMV .
TCP:[destination:000, source:000]
Ничего сложного, вывод не предназначен для анализа машинами (то есть, если люди не злоупотребляют вашим кодом), предполагаемая цель - удобочитаемость человека.
Но как насчет всей остальной той пикантной информации, о которой я говорил раньше, разве это тоже не полезно? Я перейду к этому, но сначала ...
ToString () один из самых ценных и малоиспользуемых методов всех времен
По двум причинам:
- Люди не понимают, для чего нужен ToString ()
- В базовом классе Object отсутствует другой, не менее важный строковый метод.
Причина 1. Не злоупотребляйте полезностью ToString ():
Многие люди используют ToString () для получения простого строкового представления объекта. В руководстве по C # даже говорится:
ToString - это основной метод форматирования в .NET Framework. Он преобразует объект в его строковое представление, чтобы он был пригоден для отображения.
Отображение, без дальнейшей обработки. Это не значит, что возьмите мое красивое строковое представление TCP-пакета выше и извлеките исходный порт с помощью regex :: cringe ::.
Право способ сделать вещи есть, ToString вызов () непосредственно на свойстве SourcePort (которая кстати является USHORT так ToString () уже должны быть доступны).
Если вам нужно что-то более надежное, чтобы упаковать состояние сложного объекта для машинного анализа, вам будет лучше использовать стратегию структурированной сериализации.
К счастью, очень распространены такие стратегии:
- ISerializable (C #)
- Рассол (Python)
- JSON (Javascript или любой язык, на котором он реализован)
- МЫЛО
- и т.д...
Примечание: если вы не используете PHP, потому что, herp-derp, для этого есть функция :: snicker ::
Причина 2 - ToString () недостаточно:
Мне еще предстоит увидеть язык, реализующий это в основе, но я видел и использовал варианты этого подхода в дикой природе.
Некоторые из них включают:
- ToVerboseString ()
- ToString (verbose = true)
По сути, этот беспорядок состояния TCP-пакета должен быть описан для удобства чтения человеком. Чтобы не «бить мертвую лошадь», говоря о TCP, я «укажу пальцем» на случай № 1, когда я думаю, что ToString () и ToVerboseString () используются недостаточно ...
Пример использования - массивы:
Если вы в основном используете один язык, вам, вероятно, удобен подход этого языка. Людей вроде меня, которые перепрыгивают между разными языками, количество разных подходов может раздражать.
То есть, это меня раздражало больше, чем сумма всех пальцев каждого индуистского бога вместе взятых.
Существуют различные случаи , когда языки используют общие хак и некоторые , которые получают это право . Некоторые требуют повторного изобретения колеса, некоторые делают неглубокий сброс, другие делают глубокий сброс, ни один из них не работает так, как я бы хотел ...
Я прошу очень простого подхода:
print(array.ToString());
Вывод: 'Array [x]' или 'Array [x] [y]'.
Где x - количество элементов в первом измерении, а y - количество элементов во втором измерении или какое-то значение, которое указывает на то, что 2-е измерение неровно (возможно, диапазон мин / макс?).
И:
print(array.ToVerboseString());
Выводит целую челку красивым шрифтом, потому что я ценю красивые вещи.
Надеюсь, это проливает свет на тему, которая давно меня раздражает. По крайней мере, я добавил небольшую приманку для троллей, чтобы PHP-специалисты проголосовали против этого ответа.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
или подобного.