在 VB.NET 中是否有用于执行不安全算术的实用方法?
Are there utility methods for performing unsafe arithmetic in VB.NET?
我正在覆盖获取哈希码。有一点
Hash = 1210600964 * 31 + -837896230
导致 OverflowException
。有没有我可以使用的方法,比如:
Hash = addUnsafe(multiplyUnsafe(1210600964, 31), -837896230)
无需 link 我的项目到另一个程序集?我不想删除溢出检查。 dllimports
还可以。
您可以改为使用 64 位数字进行数学运算,然后使用 And
去除多余部分:
Option Infer On
' .....
Shared Function MultiplyWithTruncate(a As Integer, b As Integer) As Integer
Dim x = CLng(a) * CLng(b)
Return CInt(x And &HFFFFFFFF)
End Function
尽管您可以在一个解决方案中混合使用 C# 和 VB.NET 项目,但在 C# 中编写 class 来执行未经检查的算法可能是最简单的,即使您不热衷于添加对另一个程序集的引用。
用 C# 编写函数甚至可能是个好主意,这样您就可以测试 VB 函数是否 return 预期值。这是我检查上面代码所做的。
编辑:Joseph Nields 的评论提示我测试性能,结果使用 CLng 而不是 Convert.ToInt64 并且运行速度更快。
我正在覆盖获取哈希码。有一点
Hash = 1210600964 * 31 + -837896230
导致 OverflowException
。有没有我可以使用的方法,比如:
Hash = addUnsafe(multiplyUnsafe(1210600964, 31), -837896230)
无需 link 我的项目到另一个程序集?我不想删除溢出检查。 dllimports
还可以。
您可以改为使用 64 位数字进行数学运算,然后使用 And
去除多余部分:
Option Infer On
' .....
Shared Function MultiplyWithTruncate(a As Integer, b As Integer) As Integer
Dim x = CLng(a) * CLng(b)
Return CInt(x And &HFFFFFFFF)
End Function
尽管您可以在一个解决方案中混合使用 C# 和 VB.NET 项目,但在 C# 中编写 class 来执行未经检查的算法可能是最简单的,即使您不热衷于添加对另一个程序集的引用。
用 C# 编写函数甚至可能是个好主意,这样您就可以测试 VB 函数是否 return 预期值。这是我检查上面代码所做的。
编辑:Joseph Nields 的评论提示我测试性能,结果使用 CLng 而不是 Convert.ToInt64 并且运行速度更快。