为什么我们不能在C#中进行IntPtr和UIntPtr算术?

Meh*_*dad 6 .net c# intptr

这是一个看起来很简单的问题:

鉴于本地大小的整数是最好的算法,为什么不C#(或任何其他.NET语言)支持算术与本地大小IntPtrUIntPtr

理想情况下,您可以编写如下代码:

for (IntPtr i = 1; i < arr.Length; i += 2) //arr.Length should also return IntPtr
{
    arr[i - 1] += arr[i]; //something random like this
}
Run Code Online (Sandbox Code Playgroud)

这样它就可以在32位和64位平台上运行.(目前,您必须使用long.)


编辑:

没有使用它们作为指针(甚至没有提到"指针"这个词)!它们可以被视为native intMSIL和intptr_tC中的C#对应物stdint.h- 它们是整数,而不是指针.

jef*_*ora 6

在.NET 4,类型的左手操作数之间的运算IntPtr和整数类型(的右操作数int,long等等)支撑.

[编辑]:正如其他人所说,它们被设计成用本地语言表示指针(如IntPtr这个名称所暗示的那样).声称你使用它们作为本机整数而不是指针是很好的,但是你不能忽视整数的原始大小重要的一个主要原因是用作指针.如果您正在执行的数学运算,或者是独立于您的代码运行的处理器和内存架构等一般功能,它可以说是更实用,更直观,如使用类型intlong你知道他们固定的大小和上无论硬件如何,在任何情况下都有下限.

正如类型IntPtr被设计为表示本机指针一样,算术运算被设计为表示您将对指针执行的逻辑数学运算:向本机指针添加一些整数偏移以到达新的本机指针(不是添加两个IntPtrs)不支持,也不IntPtr用作右手操作数).


Jon*_*Jon 6

也许原生大小的整数可以实现最快的算术,但它们肯定不能用于最无错误的程序.

就个人而言,我讨厌使用整数类型进行编程,当我坐下来开始输入时我不知道这些类型(我正在看着你,C++),我绝对更喜欢CLR类型给你带来的非常可疑和肯定使用针对平台定制的CPU指令可能提供的条件性能优势.

还要考虑JIT编译器可以针对运行进程的体系结构进行优化,而"常规"编译器必须生成机器代码而无需访问此信息.因此,JIT编译器可能会生成代码,因为它知道更多.

我想我并不是唯一一个想到这一点的人,所以它可能有理由.