代码之家  ›  专栏  ›  技术社区  ›  SwDevMan81

Intptr.Zero等于空吗?

  •  55
  • SwDevMan81  · 技术社区  · 15 年前

    我正在尝试设置 ReadFile 异步运行 MSDN 我需要设定 lpNumberOfBytesRead null :

    “如果这是一个异步操作,请对此参数使用NULL,以避免潜在的错误结果。”

    例如,如果我有以下内容:

      [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
      public static extern bool ReadFile(
         IntPtr hFile,
         out byte[] aBuffer,
         int cbToRead,
         IntPtr cbThatWereRead,
         ref OVERLAPPED pOverlapped
      );
    

    我这样称呼它(目的是让第四个参数为空):

    Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
    

    这会和用空值调用它一样吗?如果不是,我应该在声明或函数调用本身中更改什么?

    我也很好奇我是否应该使用 SafeHandle HandleRef 而不是 IntPtr 对于 hFile 参考文献?我知道要确保我用 CloseHandle(IntPtr) 当我完成后,只是不确定是否还有其他的理由使用其他两个选项 国际乒乓球联合会 . 我还试图避免使用不安全的代码。

    编辑:事实证明,我不应该将第四个参数设置为 IntPtr.Zero 不管怎样,因为即使我是异步运行的,它仍然可以立即返回。见 Asynchronous Disk I/O . 啊,我喜欢矛盾的故事。

    3 回复  |  直到 6 年前
        1
  •  69
  •   ardila kristianp    9 年前

    对于您列出的P/Invoke目的,应该使用 IntPtr.Zero 代替 NULL . 注意,这不等于c# null 但是,关键字。

        2
  •  7
  •   Yannick Motton    15 年前

    不能将空值赋给值类型。引用类型可以为空,如中所示,不引用对象实例,但值类型始终具有值。

    零只是一个表示空指针的常量值。

        3
  •  7
  •   xanatos    6 年前

    注意有一个bug(特性??)在c>=2.0中,其中

    if (IntPtr.Zero == null)
    {
        // Won't enter here
    }
    

    将正确编译,但它永远不会进入 if .

    我打开了一个关于 github of roslyn 他们回答说,他们不会修复它,因为有一些项目生成时会发出错误警告。仍然有部分修复方法:有一个 strict 生成此警告的编译模式:

    <Features>strict</Features>