Convert.TryToInt64 вместо Convert.ToInt64? - PullRequest
4 голосов
/ 19 февраля 2012

У меня есть эта функция, которую я должен реализовать:

protected override ValidationResult IsValid(
    Object value,
    ValidationContext validationContext
)
{
  //Here is where I wanna test whether the following conversion is applicable
  var x = Convert.ToInt64(value);
}

Я могу заключить эту строку в блок try-catch или другими способами выполнить этот тест, вот один из них:

var convertible = value as IConvertible;
if (convertible != null)
  var x = convertible.ToInt64(null);

Какой самый эффективный способ сделать это?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2012

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

Int64 DefaultValue = 0;
Int64.TryParse(MyVar , out DefaultValue);

есть:

Int64 DefaultValue = 0;
Int64.TryParse("1234" , out DefaultValue);

Значение по умолчанию будет 1234

Int64 DefaultValue = 0;
 Int64.TryParse("test" , out DefaultValue);

Значение по умолчанию будет 0

0 голосов
/ 19 февраля 2012

Использование IConvertible кажется наилучшим вариантом.

Я сделал короткий тест, чтобы убедиться, что мой путь быстрее, и, кажется, ПУТЬ (6 раз!) Быстрее, вытакже следует признать, что при использовании IConvertible код также выглядит намного чище и менее многословно.

static void Main(string[] args)
{
  var sw = new Stopwatch();

  sw.Start();
  for (short i = 0; i < short.MaxValue; i++)
  {
    var foo = IsValid1(i);
  }
  sw.Stop();
  var result1 = sw.Elapsed;
  Console.WriteLine(result1);

  sw.Start();
  for (short i = 0; i < short.MaxValue; i++)
  {
    var foo = IsValid2(i);
  }
  sw.Stop();
  var result2 = sw.Elapsed;

  Console.WriteLine(result2);
  Console.ReadKey();
}

static bool IsValid1(object value)
{
  var convertible = value as IConvertible;
  if (convertible != null)
    return convertible.ToInt64(null) != 0;
  return true;
}
static bool IsValid2(object value)
{
  if (value != null)
  {
    long amount;
    if (long.TryParse(value.ToString(), out amount))
      return amount != 0;
  }
  return true;
}

ВЫХОД:

00:00:00.0031987
00:00:00.0186700
0 голосов
/ 19 февраля 2012

А как насчет Int64.TryParse () ?Конечно, вам нужно .ToString() ваш value параметр, иначе я бы подумал, что это сработает.

...