面试题答案
一键面试固定语句(fixed statement)的作用
在C#中,fixed
语句用于固定一个指针指向托管对象,防止垃圾回收器在执行期间重新定位或回收该对象。这是因为垃圾回收器可能会移动对象以压缩堆空间,而指针需要指向固定的内存地址。fixed
语句创建一个临时变量,该变量在语句块执行期间保持对象在内存中的位置不变。
实际编程场景举例
- 与非托管代码交互:
- 例如,当调用外部非托管函数(如通过
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
。
- 性能优化:
- 在一些性能关键的代码段中,尤其是对数组进行频繁且高效的操作时。例如,在图像处理算法中,需要对像素数据进行直接的内存操作。假设我们有一个表示图像像素的字节数组,要对每个像素进行简单的亮度调整:
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
语句允许直接通过指针操作字节数组,在性能敏感的图像处理场景中,这种直接内存操作可能比使用常规的数组索引方式更高效。