Convert.TryToInt64而不是Convert.ToInt64?

时间:2012-02-19 02:00:21

标签: c# conditional performance

我必须实现this功能:

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 个答案:

答案 0 :(得分:3)

这里你可以定义一个默认值,如果解析(转换)适用它将返回转换后的int64,否则将返回默认值:

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

即:

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

DefaultValue将为1234

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

DefaultValue将为0

答案 1 :(得分:0)

Int64.TryParse()怎么样?当然你需要.ToString()你的value param,否则我认为这会有效。

答案 2 :(得分:0)

使用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