应该将StringBuilder.Capacity设置为.NET字符的最大数量,而不考虑空终止,或者在使用P/Invoke时,必须将GetFullPathName设置为更高,以便为空终止符保留空间。

自然的 react 是应将其设置为更高的值,但似乎P/Invoke应该会自动补偿。实际上,这实际上是在此处记录的:http://msdn.microsoft.com/en-US/library/s9ts558h(v=VS.100).aspx

出现此问题的原因是,大多数示例与上述文档并不完全一致。几乎总是对它们进行编码:

StringBuilder sb = new StringBuilder(dotNetChars + 1);
SomeWindowsAPI(sb, sb.Capacity);

代替:
StringBuilder sb = new StringBuilder(dotNetChars);
SomeWindowsAPI(sb, sb.Capacity + 1);

(我意识到某些API对缓冲区大小参数的处理方式不同。假定该API必须以常见的方式处理该缓冲区大小参数,例如sb.Capacity:http://msdn.microsoft.com/en-us/library/aa364963(v=VS.85).aspx)

在API调用中直接使用带有sb.Capacity + 1的表达式似乎是避免不匹配的最佳实践。问题在于添加+1是否正确。

看看周围。您可能会发现,唯一显示ojit_code的地方是MSDN文档。

当然,可以谨慎地分配比严格必要的缓冲区更大的缓冲区,但是我想知道有关如何执行此操作的共识。

最佳答案

我意识到您已经有5年的答案了,但是我认为他们并没有真正回答问题,他们基本上是在不检查这样做是否正确的情况下就消除了潜在的问题。
MSDN文档保证编码将确保有足够的空间来存储Capacity的完整StringBuilder以及附加的空终止符。引用Default Marshaling for Strings:

因此,您不必担心会增加一个容量,编码人员已经可以为您完成此操作。

关于.net - 使用P/Invoke时设置StringBuilder.Capacity的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4057007/

10-13 06:56