P/Indoke Helper组件中符合CLS的类型
-
04-10-2019 - |
题
我想拥有一个仅包含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)。
不隶属于 StackOverflow