• 【ZT】C#语法之fixed 语句


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

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

    // assume class Point { public int x, y; }
    // pt is a managed variable, subject to garbage collection.
    Point pt = new Point();
    // Using fixed allows the address of pt members to be
    // taken, and "pins" pt so it isn't relocated.
    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
  • 相关阅读:
    GLSL逐像素光照 【转】
    GLSL逐顶点光照[转]
    GLSL 基础量定义 【转】
    GLSL纹理贴图 【转】
    NormalMap 贴图 [转]
    glsl镜面水倒影的实现[转]
    C#调用C++Dll封装时遇到的一系列问题【转】
    在C#中使用C++编写的类——用托管C++进行封装[转]
    GEOS 使用的例子
    昌平区2015年义务教育阶段入学工作意见 (含非京籍)
  • 原文地址:https://www.cnblogs.com/samcn/p/1523957.html
Copyright © 2020-2023  润新知