使用Convert.TryToInt64而不是Convert.ToInt64?

5
我需要实现这个函数:

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个回答

7

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

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

ie:

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

默认值将为1234

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

DefaultValue的默认值是0。

你也可以通过以下方式声明变量,使代码更加简洁:

 Int64.TryParse("123" , out Int64 DefaultValue);

TryParse 返回一个布尔值,你传递的不是默认值,而是实际变量。 - BrokenGlass
你说得完全正确,现在这里是早上5:50,当你熬夜到现在这些事情就会发生;)感谢你纠正我。 - Ashkan Mobayen Khiabani
我没有测试过,但我认为我会使用原始问题中建议的 IConvertible 选项。这样更加简洁,而且将值转换为字符串根本没有意义。预期的值应该是一个数值类型(int、short、decimal 等),我想验证它不等于零。 - Shimmy Weitzhandler
我认为这里有一个误解,这些都是试图将字符串转换为int64的示例(如果适用)。例如,您可以使用null - Ashkan Mobayen Khiabani
@AshkanMobayenKhiabani,字符串和整数都实现了IConvertible :) - Shimmy Weitzhandler
var ok = Int64.TryParse(v, out long l); - cskwg

1

对我来说,使用 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

这仍然不能保证它会成功。如果任何一个“To”函数无法进行转换,它们都可能抛出“InvalidCastException”异常。 - siride
@siride,不对。as 运算符是一种条件转换,如果转换失败则返回 null,而不是抛出异常的转换运算符。 - Shimmy Weitzhandler
那不是我谈论的部分。我不怀疑将其转换为 IConvertible 的转换工作。我谈论的是对 ToInt64 的调用。这很有可能会失败并引发异常。这应该从我的最初评论中就很明显了,我明确提到了 To 函数可能会因异常而失败。 - siride
@siride,我明白你的意思。在我的情况下,我只期望得到数字值。但是你说得对。我会把这个答案留在这里,让人们了解IConvertible及其与其他方法相比的性能优势。 - Shimmy Weitzhandler

0

对于Int64.TryParse()怎么样?当然,您需要.ToString()您的value参数,否则我认为这将无法工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接