Каковы лучшие методы для безопасного анализа строки? - PullRequest
7 голосов
/ 11 августа 2010

Каковы лучшие практики для преобразования типов в C #?

   int temp=System.ConvertToInt32(Request.QueryString["Id"]);
    if (temp!=null)
      { // logic goes here }

Это не работает, если Id каким-то образом оказывается 'abc'

Пожалуйста, посоветуйте использование троичных операторовдругие однострочные операторы, кроме операторов if else (например, использование однострочных тернарных операторов).Кроме того, вы, ребята, предпочитаете TryParse вместо Convert и почему так?Попросите своих коллег.

Ответы [ 7 ]

7 голосов
/ 11 августа 2010

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

Стандартный шаблон будет выглядеть примерно так:

int value;
if (int.TryParse(Request.QueryString["Id"], out value))
{
    // Use value
}
else
{
    // Do whatever you want on failure
}

ТеперьТакже стоит помнить, что вы можете указать int.TryParse, IFormatProvider и NumberStyles - например, вы можете указать CultureInfo.InvariantCulture в качестве IFormatProvider, если это действительно означает, что это автосгенерированный идентификатор (а не тот, который введен пользователем).

Если вы хотите эффективно иметь «значения по умолчанию», вы можете написать вспомогательный метод, подобный этому:

public static int? NullableTryParseInt32(string text)
{
    int value;
    return int.TryParse(text, out value) ? value : (int?) null;
}

Затем вы можетеиспользуйте это так:

int value = NullableTryParseInt32(text) ?? 10;

Или вы можете просто написать метод, который принимает значение по умолчанию, конечно:)

1 голос
/ 11 августа 2010

Чтобы охватить аспект троичного оператора в этом вопросе:

Мой совет по использованию троичных операторов - не использовать их, если вы еще не настолько знакомы с рассматриваемым кодом, что он естественно читается длявы.Сокращение делает знакомых более знакомыми и странными, незнакомыми людьми.

Когда вы заговорили здесь о TryParse достаточно, чтобы вам даже не нужно было обдумывать это более сознательно, переход от if-else к?: будет не просто тривиальным, а автоматическим.А до тех пор вы просто добавите к своей путанице.

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

1 голос
/ 11 августа 2010

Использование TryParse будет лучшим вариантом. Поймать исключение из метода convert - это дорогостоящая операция. Конечно, TryParse будет принимать только строки, в то время как Convert.ToInt32 будет принимать объект и может выполнять преобразования (распаковку, преобразование из long / double), кроме анализа.

1 голос
/ 11 августа 2010

Казалось бы, это: http://www.kodefuguru.com/post/2010/06/24/TryParse-vs-Convert.aspx отвечает на ваш вопрос

1 голос
/ 11 августа 2010

У вас есть два способа сделать это

int i;
if (Int32.TryParse(Request.QueryString["Id"], out i))
{
}

или вы можете сделать:

try
{
     Convert.ToInt32(Request.QueryString["Id"]);
}
catch (FormatException ex)
{
   // The field Id it's not convertible
}
catch (Exception ex)
{
   // It could throw also ArgumentException or OverflowException
}
1 голос
/ 11 августа 2010

Когда дело доходит до решения любой проблемы, у которой есть несколько похожих решений, я также пытаюсь найти ту, которая выражает читателю кода то, что я пытаюсь достичь.По моему мнению, это означает переход на .TryParse в данном конкретном случае.

Использование TryParse сообщает читателю, что вы не гарантированы, что ввод действителен (если бы вы использовали, я бы вместо этого использовал анализ) И так как вы на самом деле пытаетесь проанализировать ввод какКроме того, вы можете позволить коду читать строку «Ваши намерения»

0 голосов
/ 11 августа 2010

используйте метод TryParse класса int.

int temp;
if (int.TryParse(Request.QueryString["Id"], out temp)
  { // logic goes here }

Если идентификатор не содержит числа, TryParse вернет false.

ОБНОВЛЕНИЕ: изменено для отображения int.TryParse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...