.NET Marshal.PtrToStringUni(IntPtr) vs. new String(char*)

本文关键字:String char new vs Marshal IntPtr NET PtrToStringUni | 更新日期: 2023-09-27 18:03:23

除了取char*和取IntPtr这一明显事实外,new String(char*)Marshal.PtrToStringUni(IntPtr)有什么区别?什么时候用哪个?

我记得在几年前使用构造函数时遇到了一个随机访问冲突,花了大量的时间来追踪,当我使用PtrToStringUni时它就消失了。也许那不是真正的原因,我不知道,但它似乎是。

我从来没有弄清楚区别是什么,虽然。什么好主意吗?


编辑:

这个问题回答了我的大部分问题;但是,我的访问违规是否有任何解释,还是因为其他原因?

.NET Marshal.PtrToStringUni(IntPtr) vs. new String(char*)

根据链接的答案,我可以猜测您没有将指针固定在char*上,这导致(随机)GC在构造函数仍在运行时移动char*,从而导致访问冲突。我猜一下

不同之处在于,如果使用指针,就会陷入不安全的代码中。Char *是一个实际的指针。IntPtr封装指针

从您链接的msdn:

"如果指定的数组不是以null结尾的,则此构造函数的行为依赖于系统。例如,这种情况可能导致访问冲突。"

char[]以null结尾吗?