Похоже, хорошее конструктивное решение состоит в том, что класс System.Object
и, следовательно, все классы в .NET предоставляют метод ToString()
, который, что неудивительно, возвращает строковое представление объекта. Кроме того, в C# этот метод реализуется для собственных типов, чтобы они хорошо интегрировались с системой типов.Почему нет обратного объекта.ToString()?
Это часто пригодится, когда требуется взаимодействие с пользователем. Например, объекты могут непосредственно храниться в виджетах GUI, таких как списки, и автоматически отображаются в виде текста.
Какое обоснование в плане языка не предусматривает аналогичный общий метод object.FromString(string)
?
Другие вопросы и их ответы обсуждают возможные возражения, но я считаю их не убедительными.
разбора может потерпеть неудачу, в то время как преобразование в строку всегда возможно.
Ну, это не мешает
Parse()
методы из существующих, не так ли? Если обработка исключений считается нежелательной конструкцией, можно все же определить методTryParse()
, стандартная реализация которого дляSystem.Object
просто возвращает значение false, но переопределяется для конкретных типов, где это имеет смысл (например, типы, в которых этот метод существует сегодня).В качестве альтернативы, как минимум, было бы неплохо иметь
IParseable
интерфейс, который объявляетParseMe()
илиTryParse()
метод, вдоль линийICloneable
.
Комментарий от Tim Schmelter-х "Ролл свой собственный": Это работает, конечно. Но я не могу написать общий код для собственных типов или, скажем,
IPAddress
, если я должен проанализировать значения; вместо этого мне приходится прибегать к интроспекции типа или писать обертки, которые реализуют самоопределяемый интерфейс, который либо является недружественным, либо утомительным, либо подверженным ошибкам.Комментарий от Damien: Интерфейс может только объявить не-статические функции по причинам, обсуждаемым here Эриком Липпертом. Это очень веское возражение. Статический метод
TryParse()
не может быть указан в интерфейсе. Виртуальный методParseMe(string)
, хотя нужен фиктивный объект, который в лучшем случае является kludge и в худшем случае (с RAII). Я почти подозреваю, что это основная причина такого интерфейса не существует. Вместо этого существует сложная структура преобразования типов, одна из альтернатив, упомянутых в качестве решений для «оксимерного» «статического интерфейса».
Но даже учитывая возражения в списке, отсутствие общего синтаксического анализа объекта в системе типа или языке, как представляется мне, как неудобная асимметрия, учитывая, что общий ToString()
метода существует и является чрезвычайно полезным.
Было ли это когда-либо обсуждалось во время разработки языка/CLR?
Для того, чтобы 'IParsable' работал, вам нужно сначала получить экземпляр. Если проблема заключается в том, чтобы «превратить эту строку в экземпляр X», вам кажется несколько неудобным, что вам сначала нужно получить какой-либо другой экземпляр X, чтобы вы могли называть его «FromString()». –
Что именно было бы по умолчанию для этого, просто выбросить исключение? – juharr
Вы можете преобразовать только несколько типов из строки в 'OtherType', но вы можете преобразовать все типы в' string'. Какая польза от этого? Вы всегда можете предоставить конструктор или фабричный метод (например, с шаблоном TryParse), который создает экземпляр из строки, если это необходимо и возможно. –