我想拥有一个仅包含p/legacy第三方组件的P/调用声明的单独的助手组件,我想知道,如果必须标记cls cls,那么这两种方法中的哪一种是更好的ONE™:

  • 采用 Int32 在一个 上市 p/invoke声明未管理的声明 unsigned int.
  • 采用 UInt32内部的 p/invoke声明未管理的声明 unsigned int, 并将其包裹在 上市 采用 Int32 并将其转换为 UInt32 打电话时 内部的 方法。

这些的倾向和弊端是什么?

有帮助吗?

解决方案

当UINT太大时,P/Invoke Manshaller不会抱怨,您最终会得到负面的int。额外的层确实允许您使用 检查 生成OverflowException的关键字。这是相当理想的。

是否值得麻烦是一个次要问题。许多API,例如Win32,使用Unsigned用作 逻辑 约束。就像字符串的长度或内存块的大小一样,它永远不会是负面的。实际上,这样的数字永远不会溢出。因为不可能分配那么多的内存。我不记得在API中跑过一次,在该API中,它应该使用UINT。因此,我认为您只需使用ints的直发声明即可。

其他提示

如果您使用选项1,我认为您不会得到正确的行为。INT32只能高达2,147,483,647。而未签名的INT高达4,294,967,295。只要您知道您不需要超过20亿以上的任何值,那并不重要。但是,要在技术上正确,公共界面应公开较大的类型并执行界限检查,以确保其适合未签名的int并在不签名的情况下进行异常。 INT64将进行(9,223,372,036,854,775,807)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top