zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    转:spring 的控制反转
    jsp 页面间传递参数
    Struts-config.xml配置文件《action-mappings》元素的详解
    转:装饰模式
    转:策略模式
    MyBatis的动态SQL详解
    MyBatis配置
    spring与mybatis三种整合方法
    sqlserver 脚本 多条记录遍历
    SQL Server 游标使用
  • 原文地址:https://www.cnblogs.com/samcn/p/1523957.html
Copyright © 2011-2022 走看看