Потому что позднее изменение открытых полей, чтобы получить методы доступа get / set, нарушит код См. этот ответ для получения дополнительной информации
.
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.
Я не знаю о C #, но в Java исключения дороги только тогда, когда они выброшены, но ведь они действительно очень дорогие. Если вы ожидаете, что значительная часть строк будет недействительной, стоит сначала проверить их, даже если вы используете регулярное выражение.
Но не используйте String.matches ()
или Pattern.matches ()
для применения регулярного выражения; эти методы перекомпилируют регулярное выражение каждый раз, когда вы их вызываете. Вместо этого скомпилируйте регулярное выражение заранее и сохраните его как объект Pattern, а затем выполните проверку с его помощью. В моих тестах при анализе списка из 10 000 строк, 20% из которых были недопустимыми, предварительная проверка с помощью шаблона почти в два раза быстрее, чем с использованием Integer. parseInt ()
и перехватывает исключения.
Однако это обсуждение применимо только в том случае, если вы выполняете много преобразований в замкнутом цикле. Если вы выполняете их только время от времени, например, когда вы принимаете вводимые пользователем данные, разрешить Integer.parseInt ()
выполнить проверку - это нормально. И если вы решите проверить с помощью регулярного выражения, вам понадобится гораздо лучшее регулярное выражение, чем ^ \ d * $
- это регулярное выражение будет соответствовать пустой строке, а также «числам» больше, чем Integer.MAX_VALUE
, и оно вообще не будет соответствовать отрицательным числам.
^ \ d * $
- это регулярное выражение будет соответствовать пустой строке, а также «числам» больше, чем Integer.MAX_VALUE
, и оно вообще не будет соответствовать отрицательным числам. parseInt () делает проверку в порядке. И если вы решите проверить с помощью регулярного выражения, вам понадобится гораздо лучшее регулярное выражение, чем ^ \ d * $
- это регулярное выражение будет соответствовать пустой строке, а также «числам» больше, чем Integer.MAX_VALUE
, и оно вообще не будет соответствовать отрицательным числам. Для этой цели в Java вы можете используйте хорошо известный StringUtils (на общем языке), Удачи!
Я просто хотел спросить вас о ваших предпочтениях относительно использования общедоступного статического логического значения TryParse (string s, out int result) или public static int ToInt32 (строковое значение).
Да, я использую TryParse, за исключением случаев, когда я ожидаю, что значение всегда будет действительным. Я считаю, что он читается чище, чем использование исключений. Даже если мне нужно исключение, я обычно хочу настроить сообщение или выбросить собственное исключение; следовательно, я использую TryParse и вручную генерирую исключение.
Как в Java, так и в C #, я пытаюсь отловить минимальный набор возможных исключений. В Java это означает, что я должен отдельно перехватывать исключения NullPointerException и NumberFormatException в ответ на Number.ValueOf (...); в качестве альтернативы я могу поймать "