Как избежать избыточного кода преобразования типа - PullRequest
0 голосов
/ 05 июня 2018

Я встречал этот код в одном из наших приложений и думал, что он избыточен.

string oldAdjRate = SomeDataTable.Rows[0]["SomeColumn"].ToString();
double oAdjRate;
if (double.TryParse(oldAdjRate, out oAdjRate))
{
    oAdjRate = double.Parse(oldAdjRate);
}

Это сделано для пары других значений, поэтому занимает много места.

Разве это не может быть сведено к следующему?

string oldAdjRate = SomeDataTable.Rows[0]["SomeColumn"].ToString();
double oAdjRate = double.TryParse(oldAdjRate, out oAdjRate) ? oAdjRate: 0;

Какова цель сделать double.TryParse, чтобы фактически просто double.Parse это в исходном коде.(Помимо проверки, можем ли мы сначала разобрать его) Разве мы не можем просто уменьшить одно из условий разбора и использовать условный оператор?

1 Ответ

0 голосов
/ 05 июня 2018

TryParse() всегда присваивает значение oAdjRate.Вам не нужно назначать его самостоятельно.

Теперь значение может быть не тем, что вы хотите.Если TryParse возвращает true, преобразование выполнено успешно, и значение oAdjRate будет правильным.Однако, если TryParse возвращает false, значение oAdjRate будет равно нулю.

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

string strVal = "12.3";
double dVal;
if (double.TryParse(strVal , out dVal))
{
    // Here, the value of dVal is 12.3
    System.Diagnostics.Debug.WriteLine(dVal);
}
else
{
    // Here, the value of dVal is 0.0
    throw new ArgumentException()
}

// Here, we don't know what dVal is. It could be 12.3 or 0.0.

Вот соответствующая документация MSDN :

public static bool TryParse(
  string s,
  out double result
)

[...]

результат
Когда этот метод возвращает значение, содержит число с плавающей запятой с двойной точностью, эквивалентное параметру s, если преобразование выполнено успешно, или ноль, если преобразование не удалось.Преобразование завершается неудачно, если параметр s имеет значение null или String.Empty, не является числом в допустимом формате или представляет число меньше MinValue или больше MaxValue.Этот параметр передается неинициализированным;любое значение, изначально указанное в результате, будет перезаписано.

...