【摘抄】VB.NET中Checked与Unchecked

前端之家收集整理的这篇文章主要介绍了【摘抄】VB.NET中Checked与Unchecked前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

唉,点解没有个“剪切”或“摘抄”的文章类型呢?我写的这些,既不完全是转载,又不能说是原创,也不能说是翻译。


引用 :http://www.jb51.net/article/37944.htm中说的:

在C#中有Checked与Unchecked ,对于因为整数类型参与算术操作和类型转换时产生的“溢出异常”——System.OverflowException,在某些算法来讲不算真正的“异常”,相反这种溢出常常为程序所用。C#通过引入checked和unchecked关键字来控制这种特殊情况的需求。它们都可以加于一个语句块前(如:checked{……}),或者一个算术表达式前(如:unchecked(x+y)),其中加checked标志的语句或表达式如果发生算术溢出,则抛出System.OverflowException类型的异常,而加unchecked标志的语句发生算术溢出时,则不抛出异常。unchecked只是将溢出的位丢弃而得到剩下的32位组成的十进制整数值。值得指出的是可以用“/checked”编译器选项指定整个文件代码为checked语义,如果没有指定则默认为unchecked。如果同时在程序代码中指定checked或unchecked标志,又有了checked编译器选项,则除了标志为unchecked的代码外,其余的都有checked语义。

而在VB.NET中没有Checked与Unchecked,网上有介绍说,关闭编译器选项,具体操作是:项目 ---> 项目属性 ---> 编译 ----> 高级编译选项 ----> 优化 -- [不做整数溢出检查],试过可行。


在网上找到了如下解决办法,试过可行:http://stackoverflow.com/questions/2403154/fastest-way-to-do-an-unchecked-integer-addition-in-vb-net

<StructLayout(LayoutKind.Explicit)>
Public Structure UncheckedInteger

    <FieldOffset(0)>
    Private longValue As Long
    <FieldOffset(0)>
    Private intValueLo As Integer
    <FieldOffset(4)>
    Private intValueHi As Integer

    Private Sub New(newLongValue As Long)
        longValue = newLongValue
    End Sub

    Public Overloads Shared Widening Operator CType(value As Long) As UncheckedInteger
        Return New UncheckedInteger(value)
    End Operator

    Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Long
        Return value.longValue
    End Operator

    Public Overloads Shared Widening Operator CType(value As UncheckedInteger) As Integer
        Return value.intValueLo
    End Operator

    Public Overloads Shared Operator *(x As UncheckedInteger,y As Integer) As UncheckedInteger
        Return New UncheckedInteger(x.longValue * y)
    End Operator

    Public Overloads Shared Operator Xor(x As UncheckedInteger,y As Integer) As UncheckedInteger
        Return New UncheckedInteger(x.longValue Xor y)
    End Operator

    ' Any other operator overload you need...
End Structure

使用方法
C#中代码: unchecked((int)121474836478); //返回结果为:1215752190

VB.net代码

’处理类型转换中溢出

Dim x As UncheckedInteger =121474836478 ‘ x 的结果为:1215752190

x=2

'处理运算中溢出

Dim x As UncheckedInteger =2

Dim resultAsInteger= x*2147483647 ' This would throw OverflowException using just Integers

' result 的结果为 :-2

猜你在找的VB相关文章