Це завжди доречно, але уважно розглядайте наміри, що стоять за вашим проявом
Краще питання було б задати:
Чому один би перекрив ToString ()?
ToString () - це вікно у стан об'єкта. Акцент на державі як вимозі. Сильно мови OOP, як Java / C #, зловживають моделлю OOP, інкапсулюючи все в класі. Уявіть, що ви кодуєте мовою, яка не відповідає сильній моделі OOP; Подумайте, чи використовували б ви клас чи функцію. Якщо ви використовуєте його як функцію (тобто дієслова, дії), а внутрішній стан підтримується лише тимчасово між входом / виходом, 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 () вже повинні бути доступні).
Якщо вам потрібно щось більш надійне для упаковки стану складного об'єкта для машинного розбору, вам буде краще використовувати структуровану стратегію серіалізації.
На щастя, такі стратегії є дуже поширеними:
- Імеріалізаційний (C #)
- Соління (Python)
- JSON (Javascript або будь-яка мова, яка реалізує його)
- Мило
- тощо ...
Примітка: Якщо ви не використовуєте PHP, тому що, herp-derp, є функція для цього: snicker ::
Причина 2 - ToString () недостатньо:
Я ще не бачив мови, яка реалізує це в основі, але я бачив і використовував варіанти цього підходу в дикій природі.
Деякі з яких включають:
- ToVerboseString ()
- ToString (багатослівний = вірно)
В основному, цей волохатий безлад стану пакету TCP повинен бути описаний для людської читабельності. Щоб уникнути "побиття мертвого коня", кажучи про TCP, я "вкажу пальцем" на випадок №1, де я думаю, що ToString () і ToVerboseString () недостатньо використовуються ...
Використовуйте корпус - масиви:
Якщо ви в основному використовуєте одну мову, вам, мабуть, комфортно підходити до цієї мови. Для таких людей, як я, які стрибають між різними мовами, кількість різноманітних підходів може дратувати.
Тобто, кількість разів мене це дратувало більше, ніж сума всіх пальців кожного індуїстського бога разом.
Існують різні випадки , коли мови використовують загальні хак і деякі , які отримують це право . Деякі вимагають переобладнання колеса, деякі роблять неглибокий відвал, інші роблять глибокий смітник, жоден з них не працює так, як я хотів би, щоб вони ...
Мене просять дуже простий підхід:
print(array.ToString());
Виходи: 'масив [x]' або 'масив [x] [y]'
Де x - кількість елементів у першому вимірі, а y - кількість елементів у другому вимірі або якесь значення, яке вказує на те, що 2-й розмір є нерівним (можливо, min / max діапазон?).
І:
print(array.ToVerboseString());
Виводить весь баг в чудовому друку, тому що я ціную гарні речі.
Сподіваюся, це проливає трохи світла на тему, яка мене дратувала вже давно. Принаймні, я набризнув трошки принадою для PHPers, щоб спростувати цю відповідь.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
або подібного.