toString () только полезен для отладки?

если объединить все возможные строки вместе, а затем вычислить row_number, разделить на клиентов и упорядочить по «group», а затем по убыванию last_order_date, то вы можете выбрать все строки = 1, чтобы получить «top 1» для каждого клиента

;WITH CTE_last_order_date AS
(
SELECT max(last_order_date) as 'last_order_date', customer
FROM (
SELECT distinct cust.customer, max(s2.dt_created) AS last_order_date, '2' AS 'group'
FROM customers c1 WITH (NOLOCK)

LEFT JOIN archive_orders s2 WITH (NOLOCK)
ON c1.customer = s2.customer

GROUP BY c1.customer

UNION 

SELECT distinct c1.customer, max(sord.dt_created) AS last_order_date, '1' AS 'group'
FROM customers c1 WITH (NOLOCK)

LEFT JOIN orders s1 WITH (NOLOCK)
ON cust.customer = sord.customer

GROUP BY
   c1.customer
   ) AS t
GROUP  BY customer

)
,   --row_number below is 'per customer' and can be used to make rn=1 the top 1 for each customerid
ROWN AS (SELECT Customer,last_order_date,[group], row_number() OVER(partition by customer order by [group] ASC, sord.dt_created DESC) AS RN)
SELECT * FROM Rown WHERE Rown.rn = 1
10
задан Camilo Díaz Repka 19 February 2009 в 02:27
поделиться

13 ответов

toString () полезен каждый раз, когда Вы хотите строковое представление объекта. Естественно это происходит для отладки целей, но может также быть допустимо для вывода результатов операций пользователю.

Например, скажем, у Вас есть Сложный класс, который обрабатывает комплексные числа. Если Вы хотите распечатать их пользователю в формате как 3 + 2i, удобно, если они определяют toString (), поскольку Вы не должны писать формат, каждый раз и вывод будут последовательны. Если Вы когда-нибудь хотите изменить то представление, например, к 3 + 2j, только необходимо коснуться toString () метод в Сложном классе.

Так toString () не для отладки целей также, но хороший способ получить последовательные строковые представления Ваших объектов.

12
ответ дан 3 December 2019 в 13:18
поделиться

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

Простой пример был бы то, если у Вас есть класс Имени с тремя строки (Сначала, середина, В последний раз). У Вас может быть a ToString() метод, который форматирует его для UI: "Наконец, Первая середина", например.

Или класс, который хранит математическую операцию (оценивает Left=2, Right=3, Result=6 и оператор enum=Multiply). Звонить ToString() добираться "2 * 3 = 6".

Однако, вероятно, более распространено иметь множество различных To<qualifier>String() методы, как.NET DateTime класс. (ToShortDateString(), ToLongDateString(), ToLongTimeString(), ...)

Править: Что касается того, почему это базировалось в Object класс, это просто потому что ToString() допустимая операция для чего-либо.

Кроме того, строки могут быть хорошим способом упорядочить между типами данных или потребителями данных, потому что он, как (практически) гарантируют, будет parsable и не требует дополнительного кодирования или ухода.

17
ответ дан 3 December 2019 в 13:18
поделиться

Мое персональное предпочтение - то, что toString () никогда не должен использоваться ни для чего кроме отладки. Если Вы хотите произвести строку для объекта, обеспечьте отдельный метод, который ясно документирует Ваше намерение (getName (), getDescription (), и т.д.). Никогда не полагайтесь на реализацию toString ().

Проблема состоит в том, что многие разработчики видят toString () как строка уровня отладки и ничто не думают об изменении его (скажите, когда новые поля добавлены или удалены). Heck, некоторые автоматизировали toString (), разработчики используют отражение для генерации toString () от полей.

Я нашел, что это предпочтение служило мне хорошо за эти годы.

13
ответ дан 3 December 2019 в 13:18
поделиться

Все, что я могу сказать, - то, что у меня было повреждение кода, когда я изменил toString своего класса для отображения некоторой дополнительной отладочной информации.

Рассматриваемый код был библиотекой GUI, которая решила использовать значение toString как некоторая внутренняя вещь (это было несколько лет назад... Я забываю то, чем это было точно). Конечный результат состоял в том, что я больше не пользовался той библиотекой.

Я сказал бы что, так как большая группа людей видит toString, как используемый для отладки (независимо от Вашего мнения о том, что это Вы думаете, что это должно использоваться для), что это проблематично для использования значения, возвращенного от него, чтобы сделать что-либо программное (как синтаксический анализ он) или отобразить его пользователю.

Если Вы - 100% в управлении toString методов, затем любой ценой делают то, что Вы хотите.

Так, для ответа на вопрос никакой toString не только полезен для отладки, можно сделать что-либо, что Вы хотите с ним. Однако не удивляйтесь, изменяется ли toString способами, которые делают Вас недовольными.

6
ответ дан 3 December 2019 в 13:18
поделиться

По моему опыту, toString () имеет мало значения за пределами отладки и входа. Вы не можете зависеть от, он - формат или содержание со временем, таким образом, кроме того, чтобы быть человекочитаемым, не зависьте от него ни для чего кроме самого простого из объектов (таких как типы элементарного объекта). Если существует несколько элементов данных, ожидают, что могут измениться в типе или числе со временем и выводе toString () наряду с ним.

Другая точка я хотел бы сильно сделать. Не называйте другие методы в своем toString (). Ничто худшее, чем проверка переменного содержания на точке останова в отладчике и затем наличия большего количества кода не выполняется из-за вызовов метода в toString ().

4
ответ дан 3 December 2019 в 13:18
поделиться

Я думаю, что важно указать на людей, которые ответили, что упоминание "toString" замечает, что нижний регистр "t" обычно говорит о Java и людях, которые ответили на упоминание, "ToString" обычно относятся к C#. Конечно, это не относится ко всем ответам.

В моем собственном наблюдении (я использую оба ежедневных), программисты в C# поощряются переопределить "ToString" для отображения полезного текстового представления. Принимая во внимание, что в Java я не вижу это почти как очень. На самом деле я редко вижу это.

- МИРОВОЙ СУДЬЯ

3
ответ дан 3 December 2019 в 13:18
поделиться

Полезный для

  1. Gui (сложное Свойство, когда Вы используете PropertyGrid, текст заголовка Формы),
  2. DataBinding (thats путь, как это работа)

И любая другая строка производится.

1
ответ дан 3 December 2019 в 13:18
поделиться

На AS3 я должен был преобразовать 2D массив в 1D массив. Самое быстрое (выполненная скорость) и самый легкий (кодирование времени) решение было:

var new1DArray:Array = the2DArray.toString().split(",");

Будьте удивлены, но это на самом деле работает, как предназначено и довольно быстро, также!

0
ответ дан 3 December 2019 в 13:18
поделиться

Во-первых, toString метод должен возвратить человекочитаемое текстовое представление объекта.

Эта проблема поднята в Эффективном Java как Объект 10: Всегда переопределение toString.

Это ссылается на спецификацию API Java для Object.toString метод:

Результатом должно быть краткое, но информативное представление, которое легко для человека читать.

Кроме отладки, переопределяя toString метод класса может быть полезным при добавлении объектов в a JList или a JTable, который по умолчанию будет использовать toString метод для отображения объекта как текстовой формы в списке или таблице.

Например, в моем случае, я переопределил toString метод объектов, которые добавляются к a JList так, чтобы пользователь смог видеть информацию об объекте в списке через GUI.

Так, существуют действительно случаи где toString метод полезен для случаев кроме отладки. Ключ должен иметь toString информация о возврате метода, которая на самом деле полезна для человека для наблюдения, не значение по умолчанию Object.toString реализация, где ячейка памяти объекта используется для ее текстового представления.

2
ответ дан 3 December 2019 в 13:18
поделиться

ToString () также называет Платформа.NET неявно при распечатывании любого объекта к строке.

Console.WriteLine("My Object is" + object.ToString());

эквивалентно

Console.WriteLine("My Object is" + object);

потому что ToString () неявно называют.

Я верю, хотя не уверено, что это используется отладчиком для "значения" объекта. Это может быть довольно удобно, хотя ограничено. В большинстве случаев при записи собственному отладчику visualizer был бы лучшей идеей.

0
ответ дан 3 December 2019 в 13:18
поделиться

Я использую ToString () тонна для форматов даты и времени.

http://hunterconcepts.com/content/tools/formats/

0
ответ дан 3 December 2019 в 13:18
поделиться

Кроме то, что все остальные уже сказали, переопределив ToString () также полезно при использовании средств управления, которые называют его. Например, ComboBox:

myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.
0
ответ дан 3 December 2019 в 13:18
поделиться

это не могло бы быть использование "intented", но я использовал его для сериализации данных

storeToHardDrive(studentList.ToString());
-1
ответ дан 3 December 2019 в 13:18
поделиться