Answers:
来自C#开发人员本人:
在C#中很少需要使用指针,但是在某些情况下需要使用指针。作为示例,在以下情况下需要使用不安全的上下文来允许指针:
- 处理磁盘上的现有结构
- 涉及结构中包含指针的高级COM或平台调用方案
- 关键性能代码
不建议在其他情况下使用不安全的上下文。
特别是,不应使用不安全的上下文来尝试用C#编写C代码。
警告: “无法验证使用不安全上下文编写的代码是否安全,因此只有在完全信任该代码时才能执行。换句话说,不能在不可信环境中执行不安全代码。例如,您不能运行不安全直接从互联网上进行编码。”
你可以去通过这个供参考
是的,当性能很关键而操作是低级的时候,有实际用途
例如,对于图像比较,我只需要在C#中使用一次指针即可。在一对1024x1024x32的图像上使用GetPixel进行比较需要2分钟(完全匹配)。固定图像内存并使用指针花了不到1秒的时间(当然是在同一台机器上)。
您必须记住,Microsoft的设计师是聪明的人,他们添加到C#中的所有内容至少都有一个用例。该FParsec项目使用不安全的代码带出的性能的每一个最后一滴,C#语言是可以胜任的。就拿使用的通知fixed
和stackalloc
。
private char* ReadCharsFromStream(char* buffer, int maxCount, out string overhangChars) {
Debug.Assert(maxCount >= 0);
fixed (byte* byteBuffer = ByteBuffer) {
overhangChars = null;
try {
while (maxCount >= MaxCharCountForOneByte) {// if maxCount < MaxCharCountForOneByte, Convert could throw
int nBytesInByteBuffer = FillByteBuffer();
bool flush = nBytesInByteBuffer == 0;
int bytesUsed, charsUsed; bool completed = false;
Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
buffer, maxCount, flush,
out bytesUsed, out charsUsed, out completed);
ByteBufferIndex += bytesUsed; // GetChars consumed bytesUsed bytes from the byte buffer
buffer += charsUsed;
maxCount -= charsUsed;
if (flush && completed) return buffer;
}
if (maxCount == 0) return buffer;
char* cs = stackalloc char[MaxCharCountForOneByte];
for (;;) {
int nBytesInByteBuffer = FillByteBuffer();
bool flush = nBytesInByteBuffer == 0;
int bytesUsed, charsUsed; bool completed;
Decoder.Convert(byteBuffer + ByteBufferIndex, nBytesInByteBuffer,
cs, MaxCharCountForOneByte, flush,
out bytesUsed, out charsUsed, out completed);
ByteBufferIndex += bytesUsed;
if (charsUsed > 0) {
int i = 0;
do {
*(buffer++) = cs[i++];
if (--maxCount == 0) {
if (i < charsUsed) overhangChars = new string(cs, i, charsUsed - i);
return buffer;
}
} while (i < charsUsed);
}
if (flush && completed) return buffer;
}
} catch (DecoderFallbackException e) {
e.Data.Add("Stream.Position", ByteIndex + e.Index);
throw;
}
}
}