Преобразовать. ToInt32 по сравнению с TryParse

Потому что позднее изменение открытых полей, чтобы получить методы доступа get / set, нарушит код См. этот ответ для получения дополнительной информации

.

5
задан Juan Carlos Blanco Martínez 1 October 2013 в 08:39
поделиться

4 ответа

Yes, Java is missing a similar method, although without out parameters it's actually pretty difficult to express (while wanting to return a primitive). Generally, though, in C# you should use TryParse if you expect the value to not be an integer sometimes, and ToInt32 otherwise; this way the "exceptional" situation is treated as such.

In particular if performance is your main reason for wanting TryParse, the regex matches method you post is considerably worse. The performance "expense" of Exceptions (which is, in reality, very minimal) is dwarfed by how much using them wrongly can fuzz easy understanding of control flow.

7
ответ дан 13 December 2019 в 05:41
поделиться

Я не знаю о C #, но в Java исключения дороги только тогда, когда они выброшены, но ведь они действительно очень дорогие. Если вы ожидаете, что значительная часть строк будет недействительной, стоит сначала проверить их, даже если вы используете регулярное выражение.

Но не используйте String.matches () или Pattern.matches () для применения регулярного выражения; эти методы перекомпилируют регулярное выражение каждый раз, когда вы их вызываете. Вместо этого скомпилируйте регулярное выражение заранее и сохраните его как объект Pattern, а затем выполните проверку с его помощью. В моих тестах при анализе списка из 10 000 строк, 20% из которых были недопустимыми, предварительная проверка с помощью шаблона почти в два раза быстрее, чем с использованием Integer. parseInt () и перехватывает исключения.

Однако это обсуждение применимо только в том случае, если вы выполняете много преобразований в замкнутом цикле. Если вы выполняете их только время от времени, например, когда вы принимаете вводимые пользователем данные, разрешить Integer.parseInt () выполнить проверку - это нормально. И если вы решите проверить с помощью регулярного выражения, вам понадобится гораздо лучшее регулярное выражение, чем ^ \ d * $ - это регулярное выражение будет соответствовать пустой строке, а также «числам» больше, чем Integer.MAX_VALUE , и оно вообще не будет соответствовать отрицательным числам.

parseInt () делает проверку в порядке. И если вы решите проверить с помощью регулярного выражения, вам понадобится гораздо лучшее регулярное выражение, чем ^ \ d * $ - это регулярное выражение будет соответствовать пустой строке, а также «числам» больше, чем Integer.MAX_VALUE , и оно вообще не будет соответствовать отрицательным числам.

parseInt () делает проверку в порядке. И если вы решите проверить с помощью регулярного выражения, вам понадобится гораздо лучшее регулярное выражение, чем ^ \ d * $ - это регулярное выражение будет соответствовать пустой строке, а также «числам» больше, чем Integer.MAX_VALUE , и оно вообще не будет соответствовать отрицательным числам.

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

Для этой цели в Java вы можете используйте хорошо известный StringUtils (на общем языке), Удачи!

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

Я просто хотел спросить вас о ваших предпочтениях относительно использования общедоступного статического логического значения TryParse (string s, out int result) или public static int ToInt32 (строковое значение).

Да, я использую TryParse, за исключением случаев, когда я ожидаю, что значение всегда будет действительным. Я считаю, что он читается чище, чем использование исключений. Даже если мне нужно исключение, я обычно хочу настроить сообщение или выбросить собственное исключение; следовательно, я использую TryParse и вручную генерирую исключение.

Как в Java, так и в C #, я пытаюсь отловить минимальный набор возможных исключений. В Java это означает, что я должен отдельно перехватывать исключения NullPointerException и NumberFormatException в ответ на Number.ValueOf (...); в качестве альтернативы я могу поймать "

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