【问题标题】:Is the unchecked keyword necessary in the VB.NET version of this C# statement?这个 C# 语句的 VB.NET 版本中是否需要 unchecked 关键字?
【发布时间】:2018-10-22 12:17:31
【问题描述】:

我正在转换为不提供 unchecked 关键字的 VB.NET。但在这个声明中似乎没有必要:

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

我在这里有两个观察:

  1. dwAccess 被声明为常量
  2. 分配的值恰好在System.Int32 的范围内

鉴于这些,这样做是否安全:

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);

澄清:这个问题不是关于 unchecked 关键字在 C# 中是否必要。 显然是这样的。这是关于VB.NET中缺少关键字是否会妨碍语句的成功转换。

【问题讨论】:

  • 不是 System.Int32 的 0xC0000000 超出范围吗? dotnetfiddle.net/ulwdVX
  • @HenkHolterman 是的,但是 Int32.MaxValue 是 =0x7FFFFFFF;对于更高的数字,您必须使用 UInt32,不是吗?
  • @GianPaolo:我发现 VB (link) 和 C# (link) 中的值相同。
  • 我想我明白了。看来VB默认是unchecked,而c#如果你想将0xC0000000分配给System.Int32变量则需要指定它
  • 不,相反。 VB.NET 始终使用默认项目设置进行检查。而 C# 不是。这让 C# 团队的生活变得困难,他们不得不努力在编译时进行检查。做得不好,很难做到。 VB.NET 编译器对编译时的溢出非常满意,就像往常一样。

标签: c# vb.net code-translation


【解决方案1】:

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

unchecked (C# Reference)

unchecked 关键字用于抑制溢出检查 整数类型的算术运算和转换。


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

如果原始 VB.NET 代码未选中,则等效的 C# 代码也会以相同的方式正常运行。两者都会溢出,并且都会给出相同的结果。

【讨论】:

  • 我是这么想的;非常感谢您。 (附:我可以在 11 分钟内接受你的回答。)
  • @SeanVikoren:关键字在 C# 中是必需的,VB.NET 将拒绝将 3221225472 分配给 Int32Integer 的尝试。然而,在 vb.net 中,在 &h80000000 到 &hFFFFFFFF 范围内的无后缀十六进制常量被解释为 Int32 类型的负值。
  • @supercat 这个问题需要编辑。我会尽快撤消反对票。
  • 当然,你可以使用 uint 并避免否定
  • @Basic ~ 实际上,这是一个很好的观点。根据thisuint 可以正常工作。
【解决方案2】:

是的。以下是好的:

Const dwAccess As Integer = &HC0000000

VB.Net中没有unchecked关键字,但是有一个编译标志-removeintchecks1会导致整个程序不检查整数溢出。

如果 C# 行是:

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

那么 VB.Net 的翻译将如下所示:

Const dwAccess As Integer = &HC0000000

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

【讨论】:

  • question is about c# ---> vb.net 几个月前回答正确
  • 这个问题令人困惑。问题不在于 C# 中是否需要 unchecked。正如您所指出的,这是必要的。问题是在将代码移植到 VB 时是否需要一些等价物。它不是;默认情况下,VB 允许对整数常量进行未经检查的算术运算。
  • @EricLippert:VB.NET 不允许对整数常量进行未经检查的算术运算,但将无后缀的 &C0000000 视为负整数常量。这种行为类似于 VB6 处理 16 位十六进制常量的方式,但我认为它不应该传递到 VB.NET,尽管应该有一个简单的函数来转换 unsigned->signed 带包装的数量。跨度>
  • 我想你可能想取消我的答案是否正确
  • @Saruman ~ 谢谢你的坦诚。是的,在您同意的情况下,我会要求 Eric 发表他的澄清作为答案,以便我接受。
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2016-01-12
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多