.NET Marshal.PtrToStringUni(IntPtr)与新String(char *)

时间:2011-07-22 04:10:50

标签: c# .net string marshalling

new String(char*)Marshal.PtrToStringUni(IntPtr)之间的区别是什么,除了一个明显的事实,即一个需要char*而一个需要IntPtr?我什么时候应该使用哪个?

我记得在使用构造函数时,大约需要花费大量时间来追踪真正的随机访问冲突,当我使用{{1 }}。也许这不是真正的原因,我不知道,但它似乎是。

但是,我从来没有想过差异是什么。有什么想法吗?


编辑:

This question对我的大多数问题都有答案;但是:我的访问违规是否有任何解释,还是因为其他原因?

2 个答案:

答案 0 :(得分:1)

根据链接的答案,我猜你没有将指针固定到char *,这导致(随机)让GC在构造函数仍在运行时移动char *,导致访问冲突。只是一个猜测:)

答案 1 :(得分:0)

不同之处在于,如果不放入不安全的代码,就无法使用指针。 char *是一个实际的指针。 IntPtr包装指针。

来自您链接的msdn:

“如果指定的数组不以空值终止,则此构造函数的行为取决于系统。例如,这种情况可能会导致访问冲突。”

你的char []是否以null结尾?