2010-12-16 3 views
2

У меня есть класс с большим количеством, множеством и множеством свойств. В моей программе мне приходится регистрироваться тяжело. Часто я вручную лог сборки строки, какПредоставление ToString() для моего пользовательского объекта

string log = "Current state of object:" + "Property1" + myObj.Property1 + ... 
  1. Я просто подумал, что если переопределить ToString и обеспечить ведение лога, что мне нужно. Это считается goog-практикой?
  2. Как я могу предоставить строку управления форматированием? Скажем, я хочу, чтобы мой ToString работать в двух режимах один является полным Ouput всех свойств и другим облегченным вариантом wheere только соответствующие свойства выводятся

Что-то вроде MyObj.ToString («полный») и MyObj.ToString (» основной ")

+3

i override .ToString все время для отладки. Я не вижу проблемы с этим. – RPM1984 2010-12-16 11:09:25

+0

так же. Переопределение ToString() дает гораздо более приятные «часы» в VS. – hhravn 2010-12-16 11:57:04

+1

Публикуя это как комментарий, так как OP явно * не упоминал об отладчике, но logfiles и т. Д .: Если вас беспокоит только отладчик (часы), вам может быть лучше использовать DebuggerDisplayAttribute (http: // msdn.microsoft.com/en-us/library/system.diagnostics.debuggerdisplayattribute.aspx). Кроме того, слишком сложные операции ToString() могут замедлить отладчик, потому что они (re) оцениваются довольно часто или вызывают исключение, и вы ничего не видите. – 2010-12-16 13:48:01

ответ

4

Переопределение ToString действительно хорошая практика, если вы предоставляете хорошую информацию.

Что касается разных типов ToString - это возможно, но тогда вы не будете переопределять ToString, но обеспечиваете перегрузку (о том, что любой, кто будет использовать класс, должен знать).

Я бы реализовал версию lightweight в качестве переопределения и создал функцию VerboseToString для получения полного набора свойств.

Если у вас есть много таких объектов, вы можете создать интерфейс IVerboseString с помощью метода VerboseToString и реализовать его в своих объектах. Таким образом, вы можете просто использовать ссылку на интерфейс в своем протоколе.

1
  1. это отличная практика
  2. вы могли бы, конечно, Параметризуете метод ToString, но это уже не будет означать неявное преобразование объекта в строку, так что вы не можете писать, скажем, string x = myObject; вам придется явно вызывать ToString.
1

Почему вы переопределяете ToString, но не создаете метод, который принимает параметр Enum как параметр и делает то, что вы хотите внутри?

1

Я не могу придумать какую-либо конкретную проблему, связанную с этим, и сам я часто ценю это за то, что выплевывали информацию в модульные тесты или трассировку и т. Д., Но я бы взял проблему с вашей реализацией для подробных и сжатых результатов - дон 't использовать строки voodoo или любой вид произвольного ввода - я бы предпочел, чтобы это здесь id вы либо приняли входной аргумент bool verbose, либо вы явно создали метод ToStringVerbose(). Это также хорошая практика ИМХО для вашего переопределенного метода использовать base.ToString() как часть его реализации.

Смежные вопросы