一个IntPtr
不能被用作一个指针的替代品.
该IntPtr
只包含一个数值,所以你不能用它来访问任何数据.由此得名; 它是一个与指针大小相同的整数值.您需要将值转换为指针以访问它指向的数据,因此在不使用不安全代码的情况下无法访问数据.
另请注意,这IntPtr
是一个结构,而不是一个对象,因此垃圾收集器根本不直接关注它.
CLI区分托管和非托管指针.键入托管指针,运行时已知指向值的类型,并且只允许类型安全的分配.非托管指针只能直接用于支持它们的语言,C++/CLI就是最好的例子.
相当于C#语言中的非托管指针是IntPtr
.您可以使用强制转换来自由地来回转换指针.没有指针类型与它相关联,即使它的名称听起来像"指向int的指针",它相当于void*
C/C++.使用这样的指针需要pinvoke,Marshal类或强制转换为托管指针类型.
一些代码可以使用:
using System;
using System.Runtime.InteropServices;
unsafe class Program {
static void Main(string[] args) {
int variable = 42;
int* p = &variable;
Console.WriteLine(*p);
IntPtr raw = (IntPtr)p;
Marshal.WriteInt32(raw, 666);
p = (int*)raw;
Console.WriteLine(*p);
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意unsafe
关键字在这里是否合适.你可以致电Marshal.WriteInt64(),你不会得到任何投诉.它会破坏堆栈帧.