2010-08-11 4 views
7

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

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

Это терпит неудачу, если Id какой-то образом оказывается «а»

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

+1

Temp никогда не будет равным нулю в приведенной выше строке –

ответ

7

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; 

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

+0

Привет, Jon, спасибо за ответ. Как бы вы сделали это заявление с тройным оператором? И не означает, что «out» инициализируется каждый раз, когда я оцениваю, сопоставляю или не согласую? Разве мы не должны избегать tryParse только из-за этого? –

+0

@Popo: Да, параметр 'out' инициализирован в любом случае, но почему бы вам избежать« TryParse »из-за этого? Я добавил еще пару вариантов для упрощения этого в случае, когда значение по умолчанию имеет смысл - но очень часто первая форма действительно та, с которой нужно идти. –

+0

Спасибо, Jon, Try TryParse только вернет true/false? Могу ли я проверить исключения в TryParse, как Sunrisas, используя Convert? –

0

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

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

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

UPDATE: Изменено показать int.TryParse

+0

, похоже, у меня нет метода tryparse ... Вы уверены, что не хотите вводить int.TryParse? – Chris

+0

Разве это не проблема? –

+0

Я думаю, вы хотите использовать int.TryParse, нет string.TryParse, ведь зачем вы хотите разобрать строку в строку ;-) –

1

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

Использование TryParse говорит читателю, что вы не гарантированы, что вход активен (если вы были бы я использовать вместо разбора) А так как вы на самом деле пытается разобрать вход как межды вы можете также пусть считанного код Line ваших намерений

1

у вас есть два способа сделать это вы можете сделать

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 
} 
+0

Привет, sinrisas, как я могу поймать исключения в tryParse? –

+0

Ну, вы можете поместить его в инструкцию try catch. Единственное исключение TryParse, которое, насколько мне известно, может бросать, это ArgumentException, но в этом случае я предполагаю, что вы всегда будете передавать ему строку, так что вы никогда не получите такого исключения. Идея TryParse заключается в том, чтобы не использовать инструкцию try catch, поскольку она возвращает true или false в зависимости от успеха преобразования. –

1

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

1

Для покрытия троичной аспект оператора этого вопроса:

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

Если вы достаточно подробно остановились на обсуждении TryParse, вам не нужно даже думать об этом до конца, преобразование из if-else в?: Не будет просто тривиальным, оно будет автоматическим. До тех пор ты просто собираешься добавить свое собственное замешательство.

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

+0

Спасибо за совет Jon. –

Смежные вопросы