什么是固定类型和不安全类型的区别?

5

为什么在 .NET 中有两种不同的锁定内存的方式?它们之间有什么区别?

1个回答

16

在使用unsafe修饰符的情况下,我们会用到fixed语句。Unsafe声明你将使用指针算术(例如:低级别API调用),这超出了正常的C#操作范畴。fixed语句用于锁定内存位置,以便垃圾收集器在仍在使用时不会重新分配它。你无法在unsafe范围之外使用fixed语句。

示例

public static void PointyMethod(char[] array)
{
    unsafe
    {
        fixed (char *p = array)
        {
            for (int i=0; i<array.Length; i++)
            {
                System.Console.Write(*(p+i));
            }
        }
    }
}

让我想知道为什么需要明确指定代码块/方法是不安全的,编译器在看到fixed语句时应该知道它。 - arul
返回翻译文本:true但我认为它不能推断上下文,例如方法、类型或代码块。不过这只是猜测。 - cgreeno
如果有价值的话,编译器可以自动地将固定语句包装在不安全语句中。也许在不安全代码的幕后还有其他操作,这可能会使通用的“安全”代码运行缓慢,谁知道呢。 - arul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接