Fixed 关键字使用(1)

本文详细介绍了C#中fixed语句的使用方法及其应用场景。fixed语句可以阻止垃圾回收器移动变量,允许开发者在不安全上下文中使用指针。文章通过示例展示了如何在数组和字符串中初始化指针,并提供了注意事项。

Fixed语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。

fixed 语句设置指向托管变量的指针并在 statement 执行期间钉住该变量。如果没有 fixed 语句,则指向可移动托管变量的指针的作用很小,因为垃圾回收可能不可预知地重定位变量。C#编译器只允许在 fixed 语句中分配指向托管变量的指针。

Point pt = new Point();

fixed ( int* p = &pt.x )

{

    *p = 1;

}

可以用数组或字符串的地址初始化指针:

fixed (int* p = arr) ...  // equivalent to p = &arr[0]

har* p = str) ... // equivalent to p = &str[0]

只要指针的类型相同,就可以初始化多个指针:

fixed (byte* ps = srcarray, pd = dstarray) {...}

要初始化不同类型的指针,只需嵌套 fixed 语句:

fixed (int* p1 = &p.x)

{

d (double* p2 = &array[5])

    {

// Do something with p1 and p2.

    }

}

执行完语句中的代码后,任何固定变量都被解除固定并受垃圾回收的制约。因此,不要指向 fixed 语句之外的那些变量。

无法修改在 fixed 语句中初始化的指针。

在不安全模式中,可以在堆栈上分配内存。堆栈不受垃圾回收的制约,因此不需要被锁定。

// statements_fixed.cs

// compile with: /unsafe

using System;

 

class Point

{

    public int x, y;

}

 

class FixedTest

{

    // Unsafe method: takes a pointer to an int.

    unsafe static void SquarePtrParam (int* p)

    {

        *p *= *p;

    }

 

    unsafe static void Main()

    {

        Point pt = new Point();

        pt.x = 5;

        pt.y = 6;

        // Pin pt in place:

        fixed (int* p = &pt.x)

        {

            SquarePtrParam (p);

        }

        // pt now unpinned

        Console.WriteLine ("{0} {1}", pt.x, pt.y);

    }

}

结果为:

25 6

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值