Конвертация чисел в строку.
Цитата: Oleg от 07.06.2021, 16:08Всем привет.✋
Недавно услышал такое мнение что никогда не стоит конвертировать цифры (int) в строки (string). Потому что:
1) Это медленно 🤷♂️
2) Не стоит забивать "кучу (heap)" для тривиальных задач
3) Строка - это отображение числа. А у отображения есть такое свойство, как формат. Который может быть разным в разных культурах (см. региональные настройки).
Например, число один миллион в некоторых культурах отображается как "1,000,000". В нем 7 чисел, но в строке, его отображающей, девять символов. В результате программа работает не правильно.
Будет весело, если вы разрабатываете какое-нибудь приложение для работы с финансами, например.Я только начинающий разработчик, но хотелось бы узнать подробнее об конвертации.
Всем хорошего дня😉
Всем привет.✋
Недавно услышал такое мнение что никогда не стоит конвертировать цифры (int) в строки (string). Потому что:
1) Это медленно 🤷♂️
2) Не стоит забивать "кучу (heap)" для тривиальных задач
3) Строка - это отображение числа. А у отображения есть такое свойство, как формат. Который может быть разным в разных культурах (см. региональные настройки).
Например, число один миллион в некоторых культурах отображается как "1,000,000". В нем 7 чисел, но в строке, его отображающей, девять символов. В результате программа работает не правильно.
Будет весело, если вы разрабатываете какое-нибудь приложение для работы с финансами, например.
Я только начинающий разработчик, но хотелось бы узнать подробнее об конвертации.
Всем хорошего дня😉
Цитата: XpucT от 07.06.2021, 16:52Vanya, привет 🖐
- Нет, это не медленно. И если пытаться доказать обратное, то есть страница, предоставленная Мной на JailbreakVideo, где разницу можно ощутить как в физической, так и оперативной памяти. Но это всё относительно. Смотря о чём программа.
- Опять же мусор и всё, что связано с памятью зависит от самой программы.
- Формат выставляется в настройках своей же программы разработчиком и по желанию. Запятые и точки расставляет сама операционная система и она сама понимает для какой локализации какие разделите нужны и как они будут выглядеть.
Цитата: Vanya от 07.06.2021, 16:08никогда не стоит конвертировать цифры (int) в строки (string)
Никогда – слишком громко сказано.
Я бы сказал, что если в этом нет необходимости, лучше избегать.
Это всё равно, что заявить никогда не используйтеtrycatch, а всегда юзайтеifelse.
Нужно стараться продумывать все сценарии и если попадается такой, где безcatchне обойтись, то будешь писатьtrycatch.
То же самое сToString();
Vanya, привет 🖐
- Нет, это не медленно. И если пытаться доказать обратное, то есть страница, предоставленная Мной на JailbreakVideo, где разницу можно ощутить как в физической, так и оперативной памяти. Но это всё относительно. Смотря о чём программа.
- Опять же мусор и всё, что связано с памятью зависит от самой программы.
- Формат выставляется в настройках своей же программы разработчиком и по желанию. Запятые и точки расставляет сама операционная система и она сама понимает для какой локализации какие разделите нужны и как они будут выглядеть.
Цитата: Vanya от 07.06.2021, 16:08никогда не стоит конвертировать цифры (int) в строки (string)
Никогда – слишком громко сказано.
Я бы сказал, что если в этом нет необходимости, лучше избегать.
Это всё равно, что заявить никогда не используйте Скопированоtry Скопированоcatch, а всегда юзайте Скопированоif Скопированоelse.
Нужно стараться продумывать все сценарии и если попадается такой, где без Скопированоcatch не обойтись, то будешь писать Скопированоtry Скопированоcatch.
То же самое с СкопированоToString();
Цитата: Oleg от 07.06.2021, 21:15Спасибо большое за ответ.
Всё понял😉
Спасибо большое за ответ.
Всё понял😉
Цитата: Francesco от 16.06.2021, 13:15Здравствуйте.
Поддерживаю XpucT и немного дополню от себя:
1. Любая операция занимает процессорное время. Если имеется в виду переопределение Object.ToString в System.Int32, то это создание новой строки, содержащей строковое представление – необходимый способ форматирования, его не избежать.
Нужно понимать, что в .NET API сценарии вызова перегруженных версий методов, таких как Console.Write() \ WriteLine(), String.Format() и т.д., фактически преобразуют число (если мы говорим о передаче числа) в строку, а потом, как и все строки, в массив символов.
В этом легко убедиться, просмотрев цепочку вызовов в исходном коде (например, на Microsoft Reference Source или из GAC в dotPeek):// Writes the text representation of an integer to the text stream. The // text representation of the given value is produced by calling the // Int32.ToString() method. // public virtual void Write(int value) { Write(value.ToString(FormatProvider)); }Если же Вы хотите хранить числовые данные как строки и преобразовывать их между собой, то, вероятно, это не лучший способ, так как теряется безопасность в отношении типов и появляются накладные расходы.
2. Как правило уже решено, где будут хранится разные сущности и других вариантов нет. Конечно, можно запаковывать структуры в управляемой куче, но это извращение. И также появляются накладные расходы ещё и на работу сборщика мусора.
3. Строка – это последовательная коллекция символов. Проблема может быть только при некоторых I/O операциях, скажем, при привязке значения свойства типа DateTime к таблице в WPF, что весьма легко определяется и меняется.
В целом, здесь скорее вопрос необходимости таких представлений. Лучше разделять эти понятия, но помнить, что преобразование в строки происходит много где и зачастую не явно.
Здравствуйте.
Поддерживаю XpucT и немного дополню от себя:
1. Любая операция занимает процессорное время. Если имеется в виду переопределение Object.ToString в System.Int32, то это создание новой строки, содержащей строковое представление – необходимый способ форматирования, его не избежать.
Нужно понимать, что в .NET API сценарии вызова перегруженных версий методов, таких как Console.Write() \ WriteLine(), String.Format() и т.д., фактически преобразуют число (если мы говорим о передаче числа) в строку, а потом, как и все строки, в массив символов.
В этом легко убедиться, просмотрев цепочку вызовов в исходном коде (например, на Microsoft Reference Source или из GAC в dotPeek):
// Writes the text representation of an integer to the text stream. The
// text representation of the given value is produced by calling the
// Int32.ToString() method.
//
public virtual void Write(int value) {
Write(value.ToString(FormatProvider));
}
Если же Вы хотите хранить числовые данные как строки и преобразовывать их между собой, то, вероятно, это не лучший способ, так как теряется безопасность в отношении типов и появляются накладные расходы.
2. Как правило уже решено, где будут хранится разные сущности и других вариантов нет. Конечно, можно запаковывать структуры в управляемой куче, но это извращение. И также появляются накладные расходы ещё и на работу сборщика мусора.
3. Строка – это последовательная коллекция символов. Проблема может быть только при некоторых I/O операциях, скажем, при привязке значения свойства типа DateTime к таблице в WPF, что весьма легко определяется и меняется.
В целом, здесь скорее вопрос необходимости таких представлений. Лучше разделять эти понятия, но помнить, что преобразование в строки происходит много где и зачастую не явно.