译自Eric Lippert's Blog, 原文: http://blogs.msdn.com/ericlippert/archive/2009/08/27/what-s-the-difference-between-fixed-and-fixed.aspx

某天我收到一封这样开头的邮件:

我有一个关于C# 固定大小的缓冲区的问题:

unsafe struct FixedBuffer { public fixed int buffer[100]; }

现在把缓冲区声明为固定的,它就是不可移动的...

看到这个问题我的心都碎了。如果语言细节设计容易造成误解,那么上面所遇到的情况只是极为不幸的时刻之一。

当在非安全的代码中对托管对象使用指针算法时,你要确保垃圾回收器不会把你正需要的内存移掉。当你正在用指针操作某个对象的时候,如果另外一个线程进行了资源回收,那么这个指针将完全混乱。因此,C#把变量分为“固定的”和“可变的”。如果你想要将指针应用到一个可移动的对象上,你可以使用“fixed”关键字来声明“这个局部变量是不能被垃圾回收器移动的”。当回收行为发生时,垃圾回收器要为那些正在进行的调用查看所有局部变量(那些被用到的变量需要保留);如果回收器看到某变量被标为“fixed”,它不会移动这样的变量,即使这会造成托管堆碎片(由此也看出让这样的变量固定的时间尽可能少是很重要的)。所以典型地,我们用“fixed”代表固定在某个地方。

但是在这封邮件中的“fixed”并不是这个意思,这里的意思是将此问题中的buffer的大小固定为容纳100个int变量,本质上讲,这和在结构中创建100个int类型的成员是一样的。

明显地,我们经常使用相同的关键字来表示概念上相同的东西。比如,在C#中我们经常用不同的方式使用关键字“internal”,但是所有的“internal”表示的意义都是一样的。它只是用来表示“一些实体的访问权限在同一程序集的代码中是不受限制的”。

某些时候我们也用相同的关键字来表示概念上完全不同的东西,这要依赖于用户使用的上下文环境来确定它代表的意思。比如:

var results = from c in customers where c.City == "London" select c;

class C<T> where T : IComparable<T>

很明显“where”使用于两种完全不同的方式:建立查询语句中的筛选从句,和声明一个泛型参数的约束类型。

如果一个关键字用于两种不同的意义但是这个区别非常细微,就像我们上面举到的例子,这会使人们碰到困难。那个用户的邮件将会继续问上一大堆的问题,但是这些问题都是基于一个不正确的假设——一个固定大小的缓冲区会自动地固定在内存中的某一位置。

这只能说这是一个不好的术语的混用:“固定大小”和“固定位置”都是使用“fixed”,但是使用的方式不同,这是很让人头疼的事情。然而它们之间的关联比这还要复杂:只有当某固定大小的缓冲区的容器被固定在某块内存区,你才能安全地访问存储在该缓冲区中的数据。在这个问题中,这两个概念具有很强的相关性,但是并不完全相同。

一方面,为了减少混乱,我们可以使用两个不同的关键字,比如说“pinned”和“fixed”。但是另一方面,“fixed”的所有用法只在非安全代码中才可用。对于非安全的码的所有特性,一个关键的前提假设就是:如果你想在C#中使用非安全代码,那么你肯定已经是一个完全理解CLR中内存管理的编程专家。这也是为什么我们让你在代码中标明“unsafe”的原因;它表明你关闭了安全系统并且知道自己在做什么。

在C#中可以多用的一些重要的关键字:fixed, into, partial, out, in, new, delegate, where, using, class, struct, true, false, base, this, event, return和void都至少包含两种以上不同的意思。大部分的在位于特定上下文中的时候都很清楚,但是至少前三个——fixed, into和partial——已经造成了很多的困扰,我已经收到了很多困惑的用户关于它们使用区别的问题。我接下来会看一下“into”和“partial”。

转载于:https://www.cnblogs.com/tommyli/archive/2009/10/16/1584518.html

fixed 和 fixed相关推荐

  1. 关于el-table添加fixed或fixed=“right“无横向滚动条的解决方法

    实现效果如下 在加入了fixed="right"之后可能会出现无滚动条无法滑动的情况,这时候我们需要加一个scrollbar的style样式加以解决,代码如下: 需要加上浏览器兼容 ...

  2. CSS中position属性( absolute | relative | static | fixed )详解

    我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...

  3. setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】

    本文转载自:http://blog.csdn.net/u011321546/article/details/9293547 首先要加头文件:iomanip 一:setprecision 作用:控制输出 ...

  4. SAP MM PR中的Fixed ID字段与MD04里PR单据号后的星号

    SAP MM PR中的Fixed ID字段与MD04里PR单据号后的星号 如下图是我手工使用ME51N 创建的一个采购申请单据, MD04去看这个PR, 这个PR号码后面有一个*号,代表它是一个被fi ...

  5. 跨浏览器的CSS固定定位{position:fixed}

    不知道您是否留意了,浏览本站时,浏览器右下角有一个标着top的黑色直角三角形,可以点击它返回到正在浏览的网页页眉.当滚动网页时,它的位置一直没有任何改变,您感觉它怎么样?这就是通过CSS的定位属性{p ...

  6. transform 遇上 position: fixed

    最近遇到一个有意思的现象,以下 demo 中 fixed 的元素没有相对 viewport 定位,而是相对于它的父元素进行定位. <html><head><style&g ...

  7. fixed在微信下的BUG

    2019独角兽企业重金招聘Python工程师标准>>> 最近在一个项目中,碰到了一个问题,是属于微信内部的问题,或者说,是属于APP内部的问题,它的根源来自于fixed定位以及-we ...

  8. transform限制position:fixed的跟随效果

    我们应该都知道,position:fixed可以让元素不跟随浏览器的滚动条滚动,而且这种跟随效果连它的兄弟们position:relative/absolute都限制不了.但是,真是一物降一物,pos ...

  9. 完美解决IE6中fixed抖动问题的方法

    我们可以通过position:fixed来实现元素的固定效果,如网页中底部的"回到顶部菜单",底部的toolbar,对联广告等等,可惜fixed属性在IE6及以下是不支持的.通常的 ...

最新文章

  1. python合并两个有序列表(list)
  2. java实现layui分页,MVC下实现LayUI分页的Demo
  3. 密码学基础(1)-前言
  4. 程序员保值的5个秘密
  5. Android spinner取Value和Text的值
  6. 大剑无锋之ArrayList中使用增强for循环能删除元素吗?【面试推荐】
  7. 后端:推荐九款Java 性能优化工具,你都用过吗?
  8. html单行元素居中显示,多行元素居左显示
  9. 6-4 单链表插入排序 (15分)
  10. VS运行时错误 CRT detected that the application wrote to memory after end of heap buffer
  11. HBase 表修复在线方式和离线方式
  12. 标书怎么做?标书制作教程附标书制作思维导图
  13. Lookup Transformation
  14. 你还为给自己的IT团队起名字,写口号烦恼吗?(较为流行的团队名称)
  15. vue中使用antv/g6 绘制关系图、结构图
  16. The MVGC Multivariate Granger Causality Matlab初上手记录
  17. 网上一位仁兄关于项目管理的总结
  18. aardio - 调用Python库下载蓝奏盘文件
  19. 北航计算机考博经验,北航考博经验总结和感受
  20. MySQL 内连接、外连接、全连接

热门文章

  1. [学习Cython编程]Cython编程入门
  2. RK3399 Android7.1使用网络连接ADB
  3. 服务器连接数据库mysql
  4. java 使用sourceforge.pinyin4j查询汉字拼音
  5. 用Multisim14.0仿真电感L、电容C与电阻R的电压、电流相位关系
  6. 矩阵的rank,nullspace以及eigenvalue的理解
  7. java构造方法:有参构造方法和无参构造方法区别
  8. 用UltraISO制作Ubuntu_18.04U盘启动盘
  9. 七夕将至,在线感受程序员男友的浪漫,不要再叫我们直男了好吗!!!
  10. js中对数组的增删方法:push(),pop(),unshift(),shift(),splice()的用法小结