MST
星途 面试题库

面试题:C#中固定语句的作用及使用场景

在C#里,阐述固定语句(fixed statement)的具体作用,并且举例说明在哪些实际的编程场景中会用到固定语句。
28.5万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

固定语句(fixed statement)的作用

在C#中,fixed语句用于固定一个指针指向托管对象,防止垃圾回收器在执行期间重新定位或回收该对象。这是因为垃圾回收器可能会移动对象以压缩堆空间,而指针需要指向固定的内存地址。fixed语句创建一个临时变量,该变量在语句块执行期间保持对象在内存中的位置不变。

实际编程场景举例

  1. 与非托管代码交互
    • 例如,当调用外部非托管函数(如通过DllImport调用Windows API函数),这些函数可能需要指向数据的指针。假设要调用一个非托管函数FillArray,它接受一个整数数组的指针和数组长度来填充数组:
using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("UnmanagedCode.dll")]
    public static extern void FillArray(int* array, int length);

    static void Main()
    {
        int[] managedArray = new int[10];
        fixed (int* ptr = managedArray)
        {
            FillArray(ptr, managedArray.Length);
        }
        foreach (var item in managedArray)
        {
            Console.WriteLine(item);
        }
    }
}
  • 在这个例子中,fixed语句固定了managedArray在内存中的位置,以便可以将指向它的指针传递给非托管函数FillArray
  1. 性能优化
    • 在一些性能关键的代码段中,尤其是对数组进行频繁且高效的操作时。例如,在图像处理算法中,需要对像素数据进行直接的内存操作。假设我们有一个表示图像像素的字节数组,要对每个像素进行简单的亮度调整:
using System;

class ImageProcessor
{
    public static void AdjustBrightness(byte[] pixels, int brightnessDelta)
    {
        fixed (byte* ptr = pixels)
        {
            byte* p = ptr;
            for (int i = 0; i < pixels.Length; i++)
            {
                *p += (byte)brightnessDelta;
                p++;
            }
        }
    }
}

class Program
{
    static void Main()
    {
        byte[] imagePixels = new byte[1000];
        // 初始化imagePixels
        ImageProcessor.AdjustBrightness(imagePixels, 50);
    }
}
  • 这里fixed语句允许直接通过指针操作字节数组,在性能敏感的图像处理场景中,这种直接内存操作可能比使用常规的数组索引方式更高效。