这个C#语句的VB.NET版本中是否需要未经检查的关键字?

时间:2018-05-12 05:35:22

标签: c# vb.net code-translation

我转换为VB.NET,它没有提供unchecked关键字。但在本声明中似乎没有必要:

const int dwAccess = unchecked((int)0xC0000000);

我在这里有两点意见:

  1. dwAccess被声明为常量
  2. 指定的值完全在System.Int32
  3. 的范围内

    考虑到这些,这样做是否安全:

    Const dwAccess As Integer = &HC0000000
    

    在这种情况下使用它:

    [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern SafeFileHandle CreateFile(string lpFileName, int dwAccess, int dwShareMode,
                                                    IntPtr securityAttrs, int dwCreationDisposition,
                                                    int dwFlagsAndAttributes, IntPtr hTemplateFile);
    

    澄清:这个问题不是关于C#中是否需要unchecked关键字。 显然它是。关于VB.NET中缺少关键字是否排除了语句的成功转换。

2 个答案:

答案 0 :(得分:2)

答案是肯定的。它是多余的,可以删除。

unchecked (C# Reference)

  

unchecked关键字用于抑制溢出检查   积分型算术运算和转换。

更新,这个答案应该是合格的。

如果未选中原始VB.NET代码,那么等效的C#代码也将以相同的方式取消选中。两者都会溢出,两者都会产生相同的结果。

答案 1 :(得分:0)

VB.Net中没有unchecked关键字,但是有一个编译标志-removeintchecks 1,这将导致整个程序无法检查整数溢出。

如果C#行是:

const int dwAccess = unchecked((int)0xC0000000);

然后VB.Net的翻译将如下所示:

Const dwAccess As Integer = &HC0000000

由于0xC0000000uint的范围内,但不在int的范围内,因此C#中的unchecked关键字用于将值转换为int格式。在VB.Net中,十六进制常量的转换是自动的。