@ Тимви, обнуляемые типы - это магия. Только волшебники могут безопасно использовать их :)

колледже один из моих проф. научил нас просто делатьx + "" как быстрое преобразование из базовых типов в строки.
Я не помню, в каком классе он был у меня для некоторых курсов Java и C ++ (я не использовал их в течение некоторого времени), но сейчас я использую его в C # /. Net, который я в основном разрабатываю в последнее время.

Есть ли преимущество в использовании.toString() над+"" для базовых типов, таких как int, decimal, float ...? Какие случаи будут.toString() будь лучше?

Примечание: мне показали.toString() а этот проф просто рекомендовал+"" потому что это было короче, и я только что сделал это с тех пор, не подвергая сомнению это.

 SimonC19 янв. 2011 г., 07:00
Я знаю, что на это уже был дан ответ, но более ясный метод (если вы не знаете, какой конкретноx есть) это использоватьString.valueOf(x) который внутренне делаетnull чек и звонкиx.toString().
 user16639019 янв. 2011 г., 00:23
I почти всегда использование"" + str, Это даже работает, еслиstr является нулевым, что часто - но не всегда - приятно ;-) Обратите внимание, что порядок неstr + ""! C # и Java просто имеют специальные «перегруженные»+ оператор, чтобы они оба работали; не уверен, что все ответы ниже также относятся к моей предпочтительной форме.
 18276412521619 янв. 2011 г., 00:25
Спасибо, я не думал, что это сработает в c ++, но это было так долго, что я не был уверен.
 Puppy19 янв. 2011 г., 00:19
Тег C ++ удален, так как он, безусловно, никак не связан с C ++.
 Ed S.19 янв. 2011 г., 00:17
Иногда я очень благодарен, что профессора не работают в государственном секторе, пишут реальный код.

Ответы на вопрос(7)

Я не могу говорить о каждом конкретном случае, но в целом, чтоx + "" будет делать в C # (что должно зависеть от наличия перегруженного+ оператор для любого типаx или жеstring) это назвать что-то вродеstring.Concat(x, "") который в свою очередь вызоветx.ToString так или иначе.

В типичном случае это просто означает, чтоx + "" накладные расходы еще на один вызов метода, чемx.ToString, когдаx является переменной некоторого типа значения, однако это также может привести к значениюx быть в штучной упаковке, если перегрузка для+ существует специально для типаx (это можно считать бесполезнымx будемтакже быть упакованным в вызовToString если его тип не переопределил этот метод; это меня поразилонемного реже, но это наверняка случится).

Конечно, это довольно тривиальные различия.реальный Разница между этими двумя подходами заключается в удобочитаемости; по моему опыту,x + "" не очень идиоматичен в .NET, и поэтому я был бы склонен избегать этого. Тем не менее, может случиться так, что это не так часто встречается в срезе мира .NET, в котором я живу, хотя может быть множество разработчиков .NET, которые делают это.

I будем указать, что в то время как в Java, возможно, вам пришлось написать громоздкийInteger.toString(x) для переменныхx из примитивных типов, таких какintв C # и в .NET в целом все типы (включая так называемые "примитивные") наследуются отobject и так есть методToString (вместе сGetType а такжеGetHashCode) для них.

 Timwi19 янв. 2011 г., 01:12
x.ToString() для переменнойx типа значения также будет окноx если тип значения не переопределяет метод.
 Dan Tao19 янв. 2011 г., 01:34
@ Тимви: Так и будет. Забавно - честно говоря, я даже неподумал о случае, когда тип значения не переопределяетToString как это кажется относительно редким ... что смешно, потому что ябыло специально упоминается случай, когда тип значения не перегружает+ оператор. В любом случае, я обновлю ответ.
 18276412521619 янв. 2011 г., 00:33
Спасибо, я действительно не видел, чтобы другие люди использовали + "" вообще, и по какой-то причине это выделилось мне сегодня, когда я кодировал.

декларативного, такого как использование.ToString непосредственно.

Единственное потенциальное преимущество этого синтаксиса - создание пустой строки, еслиx являетсяnull, Я бы предпочел метод расширения, если это считается преимуществом в вашем коде.

public static string NullSafeToString<T>(this T value) where T : class {
  return value == null ? "" : value.ToString();
}

Другая причина избежать этого заключается в том, что это может создать путаницу приоритетов. Например, вы точно знаете, что значениеz В следующем сценарии без использования справочных материалов?

int x = 42;
int y = 15;
string z = x + y + "";

Теперь тот же вопрос со следующим

int x = 42;
int y = 15;
string z = x + y.ToString();

Последнее, скорее всего, будет понято с первого взгляда средним разработчиком, который не нашел времени на приоритет оператора C # в памяти. Следовательно, я бы предпочел это, потому что у него меньше шансов быть неправильно понятым.

 Timwi19 янв. 2011 г., 01:15
Этот метод уже существует, он называетсяstring.Concat(object).
 JaredPar19 янв. 2011 г., 01:20
@ Тимви, я понимаю, что вам не нужно ограничение на 100%, но также нет необходимости использовать этот метод с типами значений. Я добавил ограничение, чтобы предотвратить последнее.
 JaredPar19 янв. 2011 г., 01:53
@ Тимви, обнуляемые типы - это магия. Только волшебники могут безопасно использовать их :)
 Timwi19 янв. 2011 г., 01:39
@JaredPar: Интересно! Я бы ожидалx.ToString() бросить, когда используется с типом значения Nullable, но это не так!
 Timwi19 янв. 2011 г., 01:16
О, также ... вам не нужноwhere T : class ограничение. Вы можете сравнитьvalue с участиемnull без ограничений, и он всегда будет ложным, когдаT это необнуляемый тип значения.

В дополнение к работе с примитивными типами,x+"" также работает сnull, гдеx.toString() бросаетNullPointerException, x+"" возвращается"null", Лучше это или нет, решать вам, но это разница.

что это вызовет какие-либо проблемы с производительностью. Так что это вопрос личного стиля. Используйте то, что вам или вашей команде удобно.

В Java для примитивных типов (int, doubleи т. д.) вы не можете написать.toString() потому что типы не являются объектами. Это означает, что вы можете написать что-то вроде

x + "";

или использовать

Integer.toString(x);

В C ++ нельзя использоватьx + "" чтобы сделать этот вид преобразования, так как это будет рассматриваться как арифметика указателя и даст вам неверный указатель. Используя что-то вродеboost::lexical_cast является предпочтительным способом сделать преобразование.

И ... я ничего не знаю о C #, поэтому я не буду комментировать это. :-)

 18276412521619 янв. 2011 г., 00:35
Спасибо, прошло несколько лет с тех пор, как я что-то написал на Java. Я думаю, я должен был включить Integer.toString (x); В качестве примера. Прошло больше времени с тех пор, как я использовал C ++, кто-то еще исправил меня в этом вопросе.

x+"" вызывает две функции: x.toString () и StringBuffer.append () (по крайней мере, в Java). Я полагаю, что большинство хороших JIT просто превратили бы это в один вызов функции x.toString (), но я не был уверен в этом без реального тестирования.

 user16639019 янв. 2011 г., 00:26
Или, поскольку это обычная четко определенная идиома, ее можно заменить просто нулевой проверкой (для «ссылочных типов») и ToString.

x+"". toString это методObject тип, который неявно вызывается каждый раз, когда вы добавляете какой-либо объект в строку.

Вы всегда можете переопределить этот метод в своем классе, если хотите.

Ваш ответ на вопрос