none
Использование object.ToString() RRS feed

  • Общие обсуждения

  • Всем привет.

    В процессе написания программы возник вопрос: хорошо ли использовать перегруженную версию ToString() для реализации промышленного кода, т.е. не только для отладки?

    Поясню почему у меня вообще появились сомнения на этот счет. Есть класс, который может быть представлен в виде xml-структуры. Это не то чтобы сериализация объекта для последующего восстановления, просто необходимость из множества таких объектов создать некий конфигурационный xml-файл для другой программы. В итоге всё собирается при помощи StringBuilder и сохраняется в файл. При сборке используются вызовы типа:

    stringBuilder.Append( myXmlObject );

    Т.е. операнд воспринимается как object и неявно вызывается виртуальная ToString().

    Но если по ошибке будет подставлен аргумент другого типа, то отловить на этапе компиляции это уже не получится. Что не есть хорошо.

    Как вариант можно сделать обертку, которая принимает нужный тип (реализующий xml-форматирование) и внутри уже вызывать приведенный выше код. Может быть я конечно усложняю ситуацию, но пока нахожусь в раздумьях.

    Хотелось бы послушать мнения других участников форума.

    29 ноября 2012 г. 8:26

Все ответы

  • А я как то не вижу проблем

    stringBuilder.Append( myXmlObject );

    просто вызовет ToString объекта myXmlObject и в крайнем случае вы получите строку с неймспейсами, а не то что задумано.

    То есть будет не та строка что нужна, но это не породит больших проблем.

    Переопределение ToString это все таки самый верный вариант.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    29 ноября 2012 г. 9:27
    Отвечающий
  • А я как то не вижу проблем

    stringBuilder.Append( myXmlObject );

    просто вызовет ToString объекта myXmlObject и в крайнем случае вы получите строку с неймспейсами, а не то что задумано.

    То есть будет не та строка что нужна, но это не породит больших проблем.


     В моем случае как раз породит, в силу того, что будет создан не верный конфигурационный файл.
    29 ноября 2012 г. 9:44
  • А не проще тогда проверять тип объекта и если он соответствует нужному, то выполнять вышеупомянутый код?

    Или если таких объектов много, то проверять, что бы в возвращаемой ToString'ом строке не было имени объекта (то есть это не голый ToString, а переопределенный).


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    29 ноября 2012 г. 9:52
    Отвечающий
  • А не проще тогда проверять тип объекта и если он соответствует нужному, то выполнять вышеупомянутый код?

    Или если таких объектов много, то проверять, что бы в возвращаемой ToString'ом строке не было имени объекта (то есть это не голый ToString, а переопределенный).


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Вот исходя из этого и получается, что лучше вроде как сделать свой интерфейс (а-ля IXmlable) и использовать только объекты, которые его реализуют (см. моё первое сообщение). А там уже вызывать свой метод, скажем ToXmlString(). Или сделать пустой интерфейс:
    public interface IXmlable
    { 
            
    }
    И продолжать использовать ToString();

    29 ноября 2012 г. 10:10
  • Я не понял цель применения StringBuilder. Если формируется XML, то почему бы не воспользоваться стандартными возможностями, например, XDocument/XElement ?


    Возможно, я совсем ничего не понял, но предложу метод-расширение для StringBuilder'а:

    public static StringBuilder AppendXml(this StringBuilder sb, MyXml myXmlObject)
    {
        return sb.Append(myXmlObject.ToString());
    }

    Принимает на вход нужный тип. Ошибиться нельзя (впрочем, всё равно можно ошибиться, вызвав метод Append вместо AppendXml).

    Чтобы избежать и такую ошибку, можно сделать свой класс, некий XmlBuilder, который будет принимать объекты только нужного типа, и преобразовывать в нужный формат. Идея с IXmlable по сути близка этому, но подход с другой стороны.

    29 ноября 2012 г. 21:55
  • Я не понял цель применения StringBuilder. Если формируется XML, то почему бы не воспользоваться стандартными возможностями, например, XDocument/XElement ?


    Ну, видимо, на момент написания кода XDocument/XElement ещё не были освоены в должном объеме :) Спасибо за подсказку.
    30 ноября 2012 г. 8:01