2015-07-15 3 views
2

Я переопределяю получение хеш-кода. Есть пункт, гдеСуществуют ли утилиты для выполнения небезопасной арифметики в VB.NET?

Hash = 1210600964 * 31 + -837896230 

который вызывает OverflowException. Есть ли способ, который я могу использовать, например:

Hash = addUnsafe(multiplyUnsafe(1210600964, 31), -837896230) 

Без необходимости связывать мой проект с другой сборкой? Я не хочу удалять проверки переполнения. dllimports в порядке.

+0

Возможный дубликат [Переопределение GetHashCode в VB без проверки ключевого слова без проверки/непроверенного?] (Http://stackoverflow.com/questions/4654227/overriding-gethashcode-in-vb-without-checked-unchecked-keyword-support) – sstan

+0

@sstan нет, это требует системного API, который допускает небезопасную арифметику. –

+0

небезопасно, я предполагаю, что вы хотите, чтобы ваш код разрешал арифметические переполнения без исключения исключения, не так ли? Если это так, то это то, что выполняет ключевое слово C# «unchecked», но у VB.NET нет встроенной поддержки. Связанный нить обеспечивает способы ограничения этого ограничения в VB.NET. Дайте мне знать, если я вас не понимаю. – sstan

ответ

2

Вы можете сделать математику с 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# для выполнения непроверенной арифметики, даже если вы не хотите добавлять ссылку на другую сборку.

Возможно, было бы неплохо также написать функции на C#, чтобы вы могли проверить, что функции VB возвращают ожидаемые значения. Это то, что я сделал, чтобы проверить приведенный выше код.

Редактировать: мне было предложено комментарий Джозефа Нилда, чтобы проверить производительность, и оказалось, что вместо CLI вместо Convert.ToInt64 и работает быстрее.

+1

Может быть проще определить 'Const mask = & HFFFFFFFF' и вернуть' CInt (x And mask) ', который всегда будет соответствовать' Int32' –

+0

Это решение не сработало для меня, исключение OverflowException все еще было поднято. & HFFFFFFFF равно -1 для целых чисел со знаком. Однако использование & H7FFFFFFF (aka Integer.MaxValue) сработало. –

 Смежные вопросы

  • Нет связанных вопросов^_^